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>