如何将斜杠和其他“url敏感”字符传递给WCF REST服务?
我有一个REST WCF服务,它有一个方法可以将参数作为字符串获取。 该字符串可以包含斜杠/字符。 它使我的请求错误,因为我认为URL出错了。
请求它并获得响应时(WebRequest.GetResponse())抛出“远程服务器返回错误:(400)错误请求。” 例外。
我的要求: http:// localhost:17679 / testmethod / DmC / TCGlOLz1EbEwqAls5Q == \ nh2cQzTizSBg =
我试图使用Uri.EscapeDataString,但它没有帮助,我得到与上面相同的例外。 在此转换后,我的请求如下所示: http:// localhost:17679 / testmethod / DmC%2FTCGlOLz1EbEwqAls5Q%3D%3D%0Ah2cQzTizSBg%3D
如果我在字符串中传递没有斜杠的字符串,它可以按我的意愿工作。
如何将斜杠和其他“url敏感”字符传递给WCF REST服务?
谢谢。
更新:我解决了,你可以在我的答案中看到它。
我解决了
URI模板是关键。
如果我以这种方式定义URI,它会产生上面的exception:
[OperationContract()] [WebGet(UriTemplate = "/testmethod/{testvalue}"/*, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml*/)] string TestMethod(string testvalue);
通过这种方式修改,它可以工作:
[OperationContract()] [WebGet(UriTemplate = "/testmethod?v={testvalue}"/*, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml*/)] string TestMethod(string testvalue);
无论如何,需要Uri.EscapeDataString!
在每个/之前尝试强制\。 (通常它会强制将元字符作为普通字符读取)
虽然接受的答案在某些情况下有效,但URI参数位于URI的末尾,如果URI参数位于URI的中间,它将无法工作。 但只需几个配置设置,您就可以允许应用程序接受编码的正斜杠。
接收传入请求的HttpListenerRequestUriBuilder
使用内部HttpListenerRequestUriBuilder
来解析原始请求URI。
HttpListenerRequestUriBuilder
将根据设置或不会取消编码。 将以下设置添加到app.config
文件中:
这将允许正确构建传入的Message
的To
头,而不会取消URI。
如果您在4.5之前使用的是.NET版本,我相信您可能还需要添加另一个设置,指示System.Uri
类不要转义http
和https
路径的斜杠。 此设置如下:
Uri.Match
和默认的QueryStringConverter
仍然可以使用未转义的文本,所以方法如下:
[WebGet(UriTemplate = "foos/{bar}/baz"] public Baz GetFooBaz(string bar) { // ... }
将为bar
参数提供未转义的字符串。