19

Có cách nào để lập bản đồ khu vực trong một ứng dụng ASP.NET MVC 2 đến tên miền phụ nhưCác khu vực có thể có trong bản đồ ứng dụng ASP.NET MVC 2 đến một tên miền phụ?

movies.example.com/Theater/View/2

thay vì

example.com/Movies/Theater/View/2

đó {diện tích = "Phim", controller = "Theater", action = "View", id = 2}.

+0

@mynameiscoffey, bạn đã thành công trong việc này chưa? Tôi có cùng một nhiệm vụ. –

Trả lời

11

Các khu vực không liên quan trực tiếp đến định tuyến, do đó câu hỏi của bạn sẽ trở thành "định tuyến hỗ trợ tên miền phụ?"

Câu trả lời cho điều đó thật không may là không có hỗ trợ tích hợp cho việc này.

Tuy nhiên, những tin tức tốt lành là nhiều người đã cố gắng và tìm thấy thành công với mã tùy chỉnh mà được xây dựng trên đỉnh của định tuyến:

Nếu bạn tìm hiểu cách định tuyến các tên miền phụ không có khu vực thì hãy thực hiện nó với các khu vực sẽ không còn khó khăn nữa. Chuyển đến ngữ cảnh đăng ký khu vực của bạn và sử dụng bất kỳ kỹ thuật nào bạn chọn bên trong đó. Các khu vực chỉ là một cách để nhóm các bộ điều khiển và các khung nhìn lại với nhau - chúng không có ý nghĩa nội tại rất nhiều đối với bản thân ASP.NET MVC (chúng làm một chút, nhưng không nhiều).

+1

+1 để có câu trả lời rõ ràng hơn. –

5

Bạn có thể ánh xạ miền hoặc tên miền phụ vào Khu vực MVC2 dễ dàng bằng mô-đun URL Rewrite Rewrite IIS7. Dưới đây là hai quy tắc đơn giản để ánh xạ các tên miền phụ đến hai Vùng. Tôi đã thêm một hạn chế để không sử dụng quy tắc này nếu yêu cầu cho một tệp thực sự (nghĩa là CSS, JS hoặc các tệp hình ảnh).

Đây là cấu hình mẫu mà đi ngay trong web.config của bạn:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="SubA Area"> 
       <match url=".*" /> 
       <action type="Rewrite" url="/SubA/{R:0}" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="suba.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
      </rule> 
      <rule name="SubB Area"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="subb.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="/SubB/{R:0}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

Bạn sẽ phải thay đổi các quy tắc dưới đây để làm việc với các trường hợp sử dụng cụ thể của bạn. Đặc biệt nếu bạn có bộ điều khiển trên vùng gốc mà bạn cần sử dụng. Trong trường hợp đó, chỉ cần thêm điều kiện hoặc tạo quy tắc mới.

Tải module IIS URL Rewrite (bắt buộc): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

3

tôi đã gặp cùng một vấn đề và tôi đã xây dựng một giải pháp mà làm việc cho tôi, đó là trong blog của tôi, hy vọng nó sẽ được sử dụng một số cho bạn.

Cheers Tony

1

tôi đã cố gắng rất nhiều trong những giải pháp được đề cập trên các chủ đề khác và thấy mọi thứ trở nên quá phức tạp rất nhanh chóng. Nó có vẻ như ASP.Net MVC muốn bạn sub-class Route để làm điều này loại định tuyến tiên tiến, nhưng nó dường như không bao giờ làm việc cho tôi. Tôi đã không bao giờ có thể có được một tên miền để ánh xạ tới một không gian tên, vì vậy tôi vết thương với ngoại lệ "điều khiển không rõ ràng" (kể từ khi tôi đã có một bộ điều khiển nhà ở cả hai không gian tên).

Cuối cùng, tôi đã sử dụng một ràng buộc để trỏ các tên miền phụ đến các không gian tên.

Đây là giao diện của tuyến đường của tôi. Lưu ý rằng tuyến đường này là dành cho "api". sub-domain:

 context.MapRoute(
      "Api_Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { controller = new SubdomainRouteConstraint("api.") }, 
      new[] { "BendyTree.CloudSpark.Areas.Api.Controllers" } 
      ); 

Đây là "SubdomainRouteConstraint" lớp tham chiếu ở trên:

public class SubdomainRouteConstraint : IRouteConstraint 
{ 
    private readonly string SubdomainWithDot; 

    public SubdomainRouteConstraint(string subdomainWithDot) 
    { 
     SubdomainWithDot = subdomainWithDot; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return new Regex("^https?://" + SubdomainWithDot).IsMatch(httpContext.Request.Url.AbsoluteUri); 
    } 
} 

Đó rõ ràng là khá một hack, nhưng tôi thực sự hài lòng với cách đơn giản nó đã kết thúc.

Bạn có thể dễ dàng tweek mã này để ánh xạ động một tên miền phụ đến một khu vực, nhưng tôi chỉ có hai khu vực để tôi chỉ đăng ký từng khu vực riêng biệt. Thêm vào đó điều này mang lại cho tôi sự tự do để có định tuyến khác nhau bên trong từng khu vực.

+0

Thật không may không làm việc cho tôi. Tôi có 2 bộ điều khiển Trang chủ - một trong số đó nằm trong tên miền phụ. Nó ném giống như các giải pháp khác 'Nhiều loại đã được tìm thấy phù hợp với bộ điều khiển tên là' Home '' ngoại lệ. Khi tôi đổi tên nó thành tên duy nhất hoạt động tốt. Nhưng không rõ làm cách nào để bạn tạo liên kết đến tên miền phụ? Tôi đã thử @ Html.RouteLink ("Mobile", "api_default") nhưng nó tạo liên kết đến trang chính của ứng dụng ... – Cheburek

Các vấn đề liên quan