2012-12-28 1 views
0

IHttpModule을 작성하여 세부 정보 페이지에 대한 친숙한 URL 액세스를 허용합니다. 사용자가 http://xyx.com/hotels/123/hotel-name.aspx 페이지를 사용하여 세부 정보 페이지에 액세스하려고하면 IHttpModule의 OnBeginRequest 메서드에 다시 쓰기 규칙이 적용됩니다.원본 URL에 쿼리 문자열이 포함되어 있으면 ASP.Net Context.RewritePath가 작동하지 않습니다.

여기에서 Context.RewritePath ("~/DetailPages/DetailPage.aspx", "", "Code = 123")를 사용하여 경로를 "~/DetailPages/DetailPage.aspx"로 변경하려고했습니다. 원본 URL에서 가져온 것입니다.

원래 URL에 쿼리 문자열이 없으면 세부 정보 페이지가 호출됩니다. 그러나 사용자가 http://xyz.com/hotels/123/hotel-name.aspx?show=advance에 액세스하려고하면 코드를 다시 쓰면 Context.RewritePath("~/DetailPages/DetailPage.aspx", "", "Code=123&show=advance")으로 실행됩니다. 여기에 "/hotels/123/hotel-name.aspx"페이지가 존재하지 않는다는 오류가 표시됩니다.

전에 & "Context.RewritePath"메서드를 호출 한 후 아래 주어진 Context.Request 개체에 대한 세부 정보를 가져 왔습니다. 원래 URL에 검색어 문자열이 없으면 둘 다 완벽하게 보입니다. 그러나 원본 URL에 쿼리 문자열이 포함되어있는 경우 Server.GetLastError()에 "/hotels/123/hotel-name.aspx"페이지가 표시되면 "Context_Error"내부 (이 요청 실행에 대한 오류를 수신하는 이벤트) 메서드가 있습니다.

Context.Request 개체의 추적 세부 정보는 아래를 참조하십시오. 어떤 긍정적 인 결과없이 이미 8 시간을 보냈으므로 도움/의견을 환영합니다.

--------------------------- 이전 - RewritePath 호출 ------------ ---------------

RawUrl : - /Hotels/123/hotel-name.aspx?a=b

AppRelativeCurrentExecutionFilePath : - ~/호텔/123/호텔 - name.aspx

CurrentExecutionFilePath : - /Hotels/123/hotel-name.aspx

에 Params : - A = B & __utma = 221736730.1213284380.1356606190.1356674469.1356687004.4 ..... (윈도우 + NT + 5.1 % 3B + 캠핑카 %의 3a7.0.1) + 게코 % 2f20100101 + 파이어 폭스 % 2f7.0.1

경로 : -/호텔/123/호텔 - name.aspx

PhysicalPath 인자 : - D : \ AppRoot \ 호텔 \ 161 \ 호텔 - name.aspx

URL : - http://xyz.com/Hotels/123/hotel-name.aspx?a=b

----------- ---------------- - RewritePath 호출 후 ---------------------------

RawUrl : - /Hotels/123/hotel-name.aspx?a=b

AppRelativeCurrentExecutionFilePath : - ~/DetailPages/DetailPage.aspx

CurrentExecutionFilePath : - /DetailPages/DetailPage.aspx

에 Params : - 코드 = 123 & A = B & __utma = 221736730.1213284380.1356606190.1356674469.1356687004.4 ..... (윈도우 + NT + 5.1 %의 3B + 캠핑카 %의 3a7.0.1) + 게코 % 2f20100101 + 파이어 폭스 %의 2f7.0 .1

경로 : - /DetailPages/DetailPage.aspx

PhysicalPath 인자 : - D : \ AppRoot \ DetailPages \ DetailPage.aspx

URL : - http://xyz.com/DetailPages/DetailPage.aspx?Code=123&a=b

--- Server.GetLastError - 추적 - 내부 IHttpModule의 오류 Event--

RawUrl : - /Hotels/123/hotel-name.aspx?a=b

AppRelativeCurrentExecutionFilePath : - ~/호텔/123/호텔 - name.aspx

CurrentExecutionFilePath : - /Hotels/123/hotel-name.aspx

에 Params : - A = B & __utma = 221736730.1213284380.1356606190.1356674469. 1356687004.4 .... (윈도우 + NT + 5.1 %의 3B + 캠핑카 %의 3a7.0.1) + 게코 % 2f20100101 + 파이어 폭스 % 2f7.0.1

경로 : - /Hotels/123/hotel-name.aspx

PhysicalPath : - D : \ AppRoot \ Hotels \ 161 \ hotel-name.aspx

URL : - http://xyz.com/Hotels/123/hotel-name.aspx?a=b

오류 메시지 '/Hotels/123/hotel-name.aspx은'존재하지 않는 파일.

스택 추적

at System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) 
     at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) 
     at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) 
     at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert) 
     at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert) 
     at System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) 
     at System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) 
     at System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) 
     at System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
     at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

사람이 문제가 될 수있는 것을 알 수 있습니까?

미리 감사드립니다.

+1

왜 Microsoft에서 제공하는 다시 쓰기 모듈을 사용하지 않습니까? http://www.iis.net/learn/extensions/url-rewrite-module/using-the-url-rewrite-module – iamkrillin

+0

IIS에 있습니까? 그렇다면 어떤 버전입니까? –

+0

은 IIS 7에서 믿습니다. –

답변

0

원래 URL에 쿼리 문자열이 있으면 IHttpModule을 변경하는 또 다른 URL이있었습니다. 그러므로 나는 내가 필요한 것을 얻는다.

귀하의 친절한 제안과 관심에 감사드립니다.