WCF拒绝请求" 400 Bad Request"当他们是URL数据中的冒号时

时间:2014-07-11 00:59:21

标签: c# wcf urlencode url-encoding self-hosting

我正在使用自托管WCF服务尝试一些非常简单的事情,我无法相信我花了半天时间才试图让它发挥作用。

我有一个UriTemplate用于以下端点。

[WebGet(UriTemplate="{documentName}?catalog={catalog}")]
DocData FindJobInfo(string documentName, string catalog);

当我尝试使用 docuementName 参数中包含冒号的网址命中时,它拒绝向“400 Bad Request”错误发送请求。一个实际的例子如下:

http://localhost:59982/dms/:Q9:m:w:x:h:~140410145342551.nev?catalog=test

对于那些即将说“UrlEncode it”的人。此请求也失败了:

http://localhost:59982/dms/%3AQ9%3Am%3Aw%3Ax%3Ah%3A~140410145342551.nev?catalog=test

然而 ...如果我用 documentName 中的半冒号替换所有冒号......它可以工作:

http://localhost:59982/dms/;Q9;m;w;x;h;~140410145342551.nev?catalog=test

世界上有什么?此外,第一个URL格式应该工作得很好,因为我可以使用相同的 documentName 与冒号和所有它打到供应商网站,它工作正常。我甚至尝试将以下内容添加到web.config中,但它仍然不起作用:

<system.web>
  <httpRuntime requestPathInvalidCharacters="" />
  <compilation debug="true" targetFramework="4.0" />
</system.web>

修改

我有一个回复声称冒号在URL中无效,但我用它们点击供应商端点就好了。这是一个例子:

https://api.site.company.com/v1/Document/:Q9:m:w:x:h:~140410145342551.nev/info

这是一个确切的REST调用,公司名称因隐私而更改。从此端点检索数据没有问题。我不明白为什么他们会选择这么疯狂的ID来解决他们的资源问题。但是他们做到了,它对他们有用。为什么我不能让我的端点接受它们。

1 个答案:

答案 0 :(得分:0)

该问题是由ASP.NET / IIS设置引起的。作为标准,出于某些安全性和机制原因,URL中不允许使用以下字符:

  • &LT;
  • &GT;
  • *
  • &安培;
  • \

您可以允许所有字符,如here所述,或者只删除冒号字符,如下所示:

requestPathInvalidCharacters="<,>,*,%,&,\"

您可以在Scott Hanselman博客的this article中阅读更多信息以及有关此行为的风险。