我正在编写一个REST Web服务,其方法如下:
[WebGet(
UriTemplate = "/Test/{p1}/{p2}",
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml)]
public string Test(string p1, string p2)
{
// Do something here
}
因此,如果我致电basurl/Test/prova/test
,我的方法Test
会被 p1 =“prova”和 p2 =“test”调用,一切正常罚款。
当我尝试使用具有(例如)%字符的参数时出现问题:甚至在URL代码中进行翻译时,当我尝试调用basurl/Test/prova/te%25st
时,我得到了一个
Errore HTTP 400 - 错误请求。
如果我使用
[WebGet(
UriTemplate = "/Test/{p1}?p2={p2}",
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml)]
public string Test(string p1, string p2)
{
// Do something here
}
并致电basurl/Test/prova?p2=te%25st
它有效
为什么?我能做些什么让第一个语法工作?
更新
用可能的解决方案看看我的答案
如果有人发现更好的,请发贴!!
感谢
答案 0 :(得分:1)
谷歌搜索我刚发现这个链接: http://weblogs.asp.net/imranbaloch/archive/2010/04/23/understanding-400-bad-request-exception.aspx 他们说:
ASP.NET限制:
在传递内核模式http.sys强制执行的限制之后,请求将被传递给IIS,然后传递给ASP.NET 引擎然后再次请求必须通过一些限制 ASP.NET为了成功完成它。
ASP.NET仅允许URL路径长度为260个字符(仅限路径,例如http://a/b/c/d,此处路径为a到d)。这个 意味着如果您有包含261个字符的长路径,那么您 将获得Bad Request异常。这是由于NTFS文件路径 限制。
另一个限制是可以在URL路径部分中使用哪些字符。您可以使用除某些字符之外的任何字符 因为它们在路径中被称为无效字符。这是一些 URL的路径部分中的这些无效字符<,>,*,%,&,:,\,?。 要确认这一点,只需右键单击解决方案资源管理器并添加即可 新文件夹并将此文件命名为上述任何字符,您将 得到消息。文件或文件夹也不能是空字符串 仅包含'。'或具有以下任何字符.....
为了检查上述情况,我创建了一个Web应用程序,并将Default.aspx放在A%A文件夹中(从中创建) Windows资源管理器),然后导航到, http://localhost:1234/A%25A/Default.aspx,我得到了什么回应 server是Bad Request异常。原因是%25是% ASP.NET中的无效URL路径字符的字符。不管你 可以在查询字符串中使用这些字符。
这些限制的原因是由于安全性,例如在%的帮助下,您可以对URL路径部分进行双重编码 和:用于从服务器获取某些特定资源。
所以我开始认为我的问题无法解决 我确信在用PHP编写并用Apache托管的一些REST Web服务中不存在这个问题,所以我认为这只是一个IIS / ASP“安全”限制我无法找到解决方法......
最终解决方案更新:
我找到了一个解决方案here:阅读文章以了解所有内容
你应该知道它可能有风险,所以在使用之前要好好思考。
<system.web>
<httpRuntime requestPathInvalidCharacters="" />
<pages validateRequest="false" />
</system.web>