带有 ASP.NET 路由的原始、未处理的 URL
Posted
技术标签:
【中文标题】带有 ASP.NET 路由的原始、未处理的 URL【英文标题】:Raw, unprocessed URL with ASP.NET Routing 【发布时间】:2011-09-13 19:27:33 【问题描述】:我直接使用 ASP.NET UrlRoutingModule(不通过 MVC)将某些路由映射到它们的处理程序:
RouteTable.Routes.Add(new Route("products/name", handler));
然后,在请求时,我从每条路由中获取值:
RouteData routeData = HttpContext.Current.Request.RequestContext.RouteData;
routeData.Values.TryGetValue("name", out value);
到目前为止一切都很好,我得到了每条路线的正确值。我的问题是编码:我想获取路线数据的 raw 值。示例:对于上面的路由,如果请求的 URL 是 http://example.com/products/word%2Dword,则结果“名称”是“word-word”。我想要的是确切的值“word%2Dword”。
我知道在 ASP.NET 中,我可以使用 Request.ServerVariables["HTTP_URL"] 获取未处理的原始 URL,但不幸的是我不能在这里使用它。
任何帮助将不胜感激。
谢谢
编辑
我的具体问题是我想在一个请求中使用它们的名称获取更多产品。例如,我有以下产品名称:“student,pupil”和“sick,ill”(他们的名字包含逗号)。我还在请求中使用逗号分隔名称。
我在客户端处理编码,因此 GET 请求如下所示:http://example.com/products/student%2Cpupil,sick%2Cill(我正在分别对每个名称进行编码,但我没有对分隔符进行编码)。
在服务器端,“name”参数将由 ASP.NET 自动解码,结果是:“student,pupil,sick,ill”所以现在我不知道哪个是分隔符。 Request.ServerVariables["HTTP_URL"] 返回我想要的 URL ("products/student%2Cpupil,sick%2Cill") 所以我想必须有一种方法来获取原始值路线数据。
【问题讨论】:
【参考方案1】:您看到的“原始值”实际上并不是原始值,而是经过编码以使 URL 对 HTTP 协议安全。
例如,http://example.com/products/word%2Dword 以 http://example.com/products/word-word 开头,当它从 HTTP 传输层出来时又转换为 word-word。
如果您通过 Server.URLEncode 传递它,您将返回相同的编码值(%2D 而不是 -) - 但如果您不能使用服务器变量,您是否可以访问服务器对象?
【讨论】:
就我而言,我是执行请求的人(不是通过浏览器,而是通过 REST 客户端),我负责编码。因此,我想按名称获取例如更多产品(它们的名称是:“red-tomato”和“green-apple”),我需要用“-”分隔名称,如下所示:example.com/products/red%2Dtomato-green%2Dapple。如果 ASP.NET 在我获取路由之前已经在解码 URL,那么 "name" 将是 "red-tomato-green-apple" 而我不会能够决定哪一个是分隔符。 因为 %2D IS 是一个连字符,所以你已经开始说 red-tomato-green-apple 了。使用不同的分隔符来描述不同的概念。例如,red-tomato|green-apple 确实,这将是一个解决方案,但不幸的是我无法控制产品的名称,就我而言,它们可以包含任何字符。所以不可能选择分隔符作为单个字符。 我想要的必须通过路由以某种方式成为可能,因为 Request.ServerVariables["HTTP_URL"] 为 @987654324 返回 "/products/red%2Ctomato,green%2Capple" @ 与 Request.RawUrl 相反,例如返回“red,tomato,green,apple”(我使用的是 ',' 而不是上面示例中使用的 '-' i>) 您可能无法控制产品,但您可以控制分隔产品的分隔符吗?如果 Server.URLEncode 是一个选项,那么为什么你不能在服务器端访问 ServerVariables?以上是关于带有 ASP.NET 路由的原始、未处理的 URL的主要内容,如果未能解决你的问题,请参考以下文章
如何为 ASP.NET MVC 处理“未找到 404 页面”查询的全部路由?