如何将斜杠和其他“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文件中:

        

这将允许正确构建传入的MessageTo头,而不会取消URI。

如果您在4.5之前使用的是.NET版本,我相信您可能还需要添加另一个设置,指示System.Uri类不要转义httphttps路径的斜杠。 此设置如下:

         

Uri.Match和默认的QueryStringConverter仍然可以使用未转义的文本,所以方法如下:

 [WebGet(UriTemplate = "foos/{bar}/baz"] public Baz GetFooBaz(string bar) { // ... } 

将为bar参数提供未转义的字符串。