WCF拒绝带有“400个错误请求”的请求;当URL数据中有冒号时

本文关键字:请求 URL 数据 拒绝 400个 WCF 错误 | 更新日期: 2023-09-27 18:12:20

我正在尝试一些非常简单的使用自托管的WCF服务,我不敢相信我花了半天的时间只是为了让它工作。

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

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

并且当我试图用docuementName参数中有冒号的URL命中它时,它拒绝以"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和冒号来访问供应商网站,它工作得很好。我甚至试过在网上添加以下内容。

<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来分配他们的资源。但他们做到了,而且对他们很有效。为什么我不能让我的端点接受它们

WCF拒绝带有“400个错误请求”的请求;当URL数据中有冒号时

这个问题是由ASP。NET/IIS设置。作为标准,出于安全和机制原因,以下字符不允许出现在URL中:

  • & lt;
  • >
  • *
  • %
  • :
  • '

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

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

您可以在Scott Hanselman的博客上阅读关于行为的进一步信息和风险。