2011-03-21 4 views
2

IIS6을 실행하는 경우.
그래서 '.' IIS6에서는 작동하지 않지만 Visual Studio 디버거와 IIS7에서는 제대로 작동합니다. 여기에 재현 할 단계가 있습니다.MVC 3은 '.'을 허용하지 않습니다. URL 경로에서 IIS6을 사용할 때

재현 단계 :
- 빈 MVC 3 프로젝트부터 시작하십시오.
- 추가 "색인"이라는 새로운보기가 기본값을 사용합니다.
는 -) (RegisterRoutes 구성은 다음과 같습니다 :

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "QuerySomething", 
     "QueryStuff/Index/{*aString}", 
     new { controller = "QueryStuff", action = "Index", aString = UrlParameter.Optional } // Parameter defaults 
    ); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 

} 
이제

, JSON을 반환하는 컨트롤러를 추가 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

    namespace MvcApplication1.Controllers 
    { 
     public class QueryStuffController : Controller 
     { 
      // 
      // GET: /QueryStuff/ 

      public ActionResult Index(string aString) 
      { 
       return Json("aString:oye",JsonRequestBehavior.AllowGet); 
      } 

     } 
    } 
  1. 페이지에 액세스 할 수 있는지 확인합니다

    http://serverName/QueryStuff/Index/someInfo

당신은 200

이제
  1. 가 함께 거기에 도착하려고 HTTP GET한다 '.'

    http://serverName/QueryStuff/Index/someInfo.com

경로에 당신은 HTTP 404 오류가 발생합니다. (비주얼 스튜디오 디버거를 통해 실행할 때이 오류가 재생 될되지 않습니다. 하나는 IIS에 코드를 배포해야합니다.)

UPDATE
내가 email 주소를 route에 정규식을 수정하고 문제가 더 악화했다.

routes.MapRoute(
     "QuerySomething", 
     "QueryStuff/Index/{aString}" 
     , new { controller = "QuerySomething", action = "Index" }, 
     new { aString = @"\b[A-Z0-9._%-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b" } 
     ); 

이것은 매번 404 번입니다.

답변

4

나는 이것이 MVC 오류라고 생각하지 않는다. http의 한계가 더 큰가? 우리는 같은 문제를 가지고 이렇게 스왑 핑을 끝내었다. " "!" URL에서 '.'로 다시 변환합니다. 컨트롤러에서.

+1

이 작업을 수행 할 수 있습니다. –

+1

@ColinDesmond : "http의 제한"비트로 어디로 가고 있는지 잘 모르겠습니다. HTTP는'.'에 아무런 문제가 없으며 URL과 URI에서 일반적으로 사용됩니다 (인터넷 라우팅 가능 도메인 이름에서도 필요합니다). 아마도 RegEx 나 웹 서버가 라우팅 규칙에서'.'을 구문 분석하는 것을 의미했을까요? – Powerlord

+1

@Colin Desmond -이 문제는 IIS6과 관련이 있다고 확신합니다. BuildStarted는 IIS7에서 문제를 재현 할 수 없기 때문에 Visual Studio 디버거에서이 기능이 잘 작동합니다. 나는 당신의 아이디어를 사용하여 대체하고 있습니다. ' char와 '!'. @Haacked와 같은 누군가가 문제를 확인할 때까지 해결 방법으로 작동합니다. –

1
routes.MapRoute(
    "QuerySomething", 
    "QueryStuff/Index/{*aString}", 
    new { controller = "QueryStuff", action = "Index", aString = UrlParameter.Optional } // Parameter defaults 
); 

경로에 와일드 카드 문자를 잊어 버렸습니다. (위의 aString 참고) 그러나 사용할 때주의해야 할 점은 http://serverName/QueryStuff/Index/something.com/blah/blah/blah/blah과 일치한다는 것입니다. 점이 파일 확장자 구분 기호이므로 포함되지 않습니다. 항상 확장 기능을 사용할 수 있다는 것을 알고 있다면

+0

@BuildStarted - {* aString}과 (과) 404가 계속 표시됩니다. 또한 {* aString *}을 (를) 시도했습니다. 차이는 없습니다. 적은 메모에서 Visual Studio 디버거를 사용할 때 오류가 발생하지 않는 이유는 설명하지 않습니다. –

+0

여기에서 테스트 해 보면 정상적으로 작동합니다. '{* aString *}'는'{* aString} '이 되어야만 작동합니다. IIS7을 실행하고있어 문제가 될 수 있습니까? IIS6를 실행하고 있습니까? – Buildstarted

+0

디버거 관련. 게시 할 IIS의 버전에 따라 달라질 수 있습니다. – Buildstarted

관련 문제