当原始URL包含查询字符串时,ASP.Net Context.RewritePath不起作用

时间:2012-12-28 13:45:31

标签: asp.net rewritepath

我正在编写IHttpModule以允许友好的URL访问我们的详细信息页面之一。当用户尝试使用http://xyx.com/hotels/123/hotel-name.aspx页面访问详细信息页面时,重写规则将应用于IHttpModule的OnBeginRequest方法。

在这里,我写道使用Context.RewritePath(“〜/ DetailPages / DetailPage.aspx”,“”,“Code = 123”)将路径更改为“〜/ DetailPages / DetailPage.aspx”,其中123是代码来自原始网址。

现在,如果原始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包含查询字符串时,Inside“Context_Error”(一个事件来监听此请求执行的任何错误)方法,当获取Server.GetLastError()时说“/hotels/123/hotel-name.aspx”页面不存在

请参考以下Context.Request对象的跟踪详细信息。欢迎您提供帮助/意见,因为我已经花了8小时没有任何积极的结果。

--------------------------- 之前 - RewritePath调用 ---------------------------

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

AppRelativeCurrentExecutionFilePath: - 〜/ Hotels / 123 / hotel-name.aspx

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

参数: - a = b& __ utma = 221736730.1213284380.1356606190.1356674469.1356687004.4 .....(Windows + NT + 5.1%3b + rv%3a7.0.1)+ Gecko%2f20100101 + Firefox%2f7.0.1

路径: - /Hotels/123/hotel-name.aspx

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

网址: - 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

参数: - 代码= 123& a = b& __ utma = 221736730.1213284380.1356606190.1356674469.1356687004.4 .....(Windows + NT + 5.1%3b + rv%3a7.0.1)+ Gecko%2f20100101 + Firefox%2f7。 0.1

路径: - /DetailPages/DetailPage.aspx

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

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

--- Server.GetLastError - 跟踪 - 内部IHttpModule的错误事件 -

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

AppRelativeCurrentExecutionFilePath: - 〜/ Hotels / 123 / hotel-name.aspx

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

Params: - a = b& __ utma = 221736730.1213284380.1356606190.1356674469.1356687004.4 ....(Windows + NT + 5.1%3b + rv%3a7.0.1)+ Gecko%2f20100101 + Firefox%2f7.0.1

路径: - /Hotels/123/hotel-name.aspx

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

网址: - 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 个答案:

答案 0 :(得分:0)

在原始URL中找到查询字符串时,还有另一个IHttpModule更改URL。因此,我得到了我需要的东西。

感谢大家的善意和兴趣。