2

MVC3 웹 사이트를 만들려고합니다. 최소한 두 개의 영역이 필요하지만 각 영역마다 다른 URL이 필요합니다. 이처럼 :mvc3 영역에 호스트 이름이 있습니다.

domain.com/ 간다 admin.domain.com/는

anotherSite.com/가/지역/포털로 이동/지역/관리로 이동/

몇 가지 조사를 수행 한 후 나는 다음과 같이 HostNameContraint를 사용할 수 Lucero's link을 발견했다 :

public class HostNameContraint : IRouteConstraint 
{ 
    protected string _hostname; 

    public HostNameContraint(string hostname) 
    { 
     _hostname = hostname; 
    } 

    bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (httpContext.Request.Url.Host == _hostname) 
      return true; 
     return false; 
    } 
} 
이 같은

후 등록 제약은 : 그들은 각각의 사이트에 응용 프로그램의 루트 폴더를 가리 키도록

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { hostname = new HostNameContraint("domain.com") }, 
      new[] { "MVCProject.Controllers" } 
     ); 

     routes.MapRoute(
      "Admin_Default2", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { hostname = new HostNameContraint("admin.domain.com") }, 
      new[] { "MVCProject.Controllers.Areas.Admin.Controllers" } 
     ); 

     routes.MapRoute(
      "Portal_Default2", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      new { hostname = new HostNameContraint("anotherSite.com") }, 
      new[] { "MVCProject.Controllers.Areas.Portal.Controllers" } 
     ); 

나는 IIS 설정을 가지고있다. "Domain.com"루트가 올바르게 작동하지만 "Admin.domain.com"또는 "Domain.com/admin/"으로 이동하면 404 "리소스를 찾을 수 없습니다."라는 메시지가 나타납니다.

업데이트 나는 URL의 시작 부분과 끝 부분에 모두 영역 이름을 사용하여 시도했다. 은 "포털"영역이 경로에있을 때

"포털/{컨트롤러}/{동작}/{ID}는"

이 문제는, 서명은 이름과 일치하지 않는 것을 "anotherSite.com"따라서 다시 와서 403.14 - 금지 말한다. 이 디렉토리의 내용을 나열 할 수 없습니다. 또한 "Portal"영역이 url 매개 변수 일 때 HostNameConstraint의 생성자가 호출되지 않는다는 점에 유의해야합니다.

답변

0

URL을 영역으로 구분하는 것을 나타내려면 영역 이름이 URL의 일부 여야합니다. 그렇지 않으면 영역을 URL에서 파싱 할 수 없으므로 기본 라우팅으로 되돌아갑니다.

routes.MapRoute(
     "Admin_Default2", // Route name 
     "Admin/{controller}/{action}/{id}", // URL with parameters 
     new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { hostname = new HostNameContraint("admin.domain.com") }, 
     new[] { "MVCProject.Controllers.Areas.Admin.Controllers" } 
    ); 

    routes.MapRoute(
     "Portal_Default2", // Route name 
     "Portal/{controller}/{action}/{id}", // URL with parameters 
     new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { hostname = new HostNameContraint("anotherSite.com") }, 
     new[] { "MVCProject.Controllers.Areas.Portal.Controllers" } 
    ); 

routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
     new { hostname = new HostNameContraint("domain.com") }, 
     new[] { "MVCProject.Controllers" } 
    ); 
: 다른 모든 경로 매핑

참고 해당지도 노선의 통화에서 "관리자 /"와 "포털 /"의 추가를 테스트하기 위해 - 또한, 마지막으로 기본 경로를 넣어 좋은 생각이다

+0

예 처음에는 Area 이름과 함께 Area name을 사용하여 시도했습니다. IE "Portal/{controller}/{action}/{id}", // 매개 변수가있는 URL 문제는 "Portal"영역이 경로에있을 때 "anotherSite.com" "Portal"영역을 직접 가리켜 야하므로 "anotherSite.com"은 "Portal/{controller}/{action}/{id}"와 일치하지 않습니다. // 매개 변수 ' –

관련 문제