REST Web服务“错误的请求”
我在写有这样的方法的REST Web服务: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 =“测试”和一切工作正常。
问题是当我尝试使用具有(例如)设置了一个param %焦炭:连翻译它在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
它的工作原理。
为什么?我能做些什么来让第一个语法工作?
更新:
看看我的答案与可能的解决方案。
如果有人发现一个更好的,请张贴它!
感谢
周围的Googling我找到此链接: http://weblogs.asp.net/imranbaloch/archive/2010/04/23/understanding-400-bad-request-exception.aspx ,他们说:
ASP.NET限制:
路过内核模式实施的限制后, http.sys然后将请求传递给IIS,然后再引发到ASP.NET 引擎,然后再次请求必须通过一些来自 ASP.NET的限制以便com成功完成它。
ASP.NET只允许URL路径长度为260个字符(只有路径,例如http://a/b/c/d,这里的路径是从a到d)。这 意味着如果你有长路径包含261个字符,那么你 将得到错误的请求异常。这是由于NTFS文件路径 的限制。
另一个限制是哪些字符可以在URL路径部分中使用。您可以使用除某些字符 之外的任何字符,因为它们在路径中称为无效字符。这些是 这些无效字符在路径部分的一个URL,<,>,*,%,&,:,\ ,?。 要确认这一点,只需右键单击您的解决方案资源管理器,然后添加 新建文件夹并将该文件命名为以上任何一种字符,您将会收到该消息 。文件或文件夹不能为空字符串,也不能包含“。”。或有任何下列字符.....
为了检查我创建了一个Web应用程序上面的情况,并把Default.aspx的A%里面的文件夹(从 Windows资源管理器创建的),然后导航到, http://localhost:1234/A%25A/Default.aspx,我从 服务器得到的响应是错误的请求异常。原因是%25是% 字符,它是ASP.NET中无效的URL路径字符。但是你可以在查询字符串中使用这些字符。
这些限制的原因是由于安全性,例如在%帮助下,您可以对URL路径部分 进行双重编码,并且:用于从服务器获取某些特定资源。
所以我开始觉得我的问题是不可能解决的。
我敢肯定,这个问题是不存在于一些REST web服务用PHP编写和Apache托管,所以我认为这只是一个IIS/ASP“安全”的限制,我找不到解决方法...
最终解决方案的更新:
我找到了解决方案here:阅读文章以了解所有内容。
你应该知道它可能是有风险的,所以在使用它之前要考虑好。
<system.web>
<httpRuntime requestPathInvalidCharacters="" />
<pages validateRequest="false" />
</system.web>