【问题标题】:REST webservice "Bad request"REST 网络服务“错误请求”
【发布时间】:2012-03-06 18:13:50
【问题描述】:

我正在编写一个具有如下方法的 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 即可。
为什么?我该怎么做才能让第一个语法起作用?

更新:
用可能的解决方案查看我的答案。
如果有人找到更好的,请发布!!
谢谢

【问题讨论】:

    标签: c# web-services rest


    【解决方案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 个字符的长路径,那么您 将得到错误请求异常。这是由于 NTFS 文件路径 限制。

    另一个限制是 URL 路径部分可以使用哪些字符。您可以使用除某些字符之外的任何字符 因为它们在路径中被称为无效字符。这里有一些 URL 路径部分中的这些无效字符,,*,%,&,:,\,?。 为了确认这一点,只需右键单击您的解决方案资源管理器并添加 新建文件夹并将此文件命名为上述任何字符,您将 得到消息。文件或文件夹不能是空字符串,也不能是空字符串 仅包含 '.'或具有以下任何字符.....

    为了检查上述情况,我创建了一个 Web 应用程序并将 Default.aspx 放在 A%A 文件夹中(从 Windows 资源管理器),然后导航到, http://localhost:1234/A%25A/Default.aspx,我得到的回应 服务器是错误请求异常。原因是 %25 是 % ASP.NET 中无效的 URL 路径字符。然而你 可以在查询字符串中使用这些字符。

    这些限制的原因是出于安全考虑,例如在 % 的帮助下,您可以对 URL 路径部分进行双重编码 and : 用于从服务器获取一些特定的资源。

    所以我开始认为我的问题无法解决。
    我确信这个问题在一些用 PHP 编写并由 Apache 托管的 REST Web 服务中不存在,所以我认为这只是一个 IIS/ASP“安全”限制,我找不到解决方法......

    更新最终解决方案:
    我找到了解决方案here:阅读文章了解一切。
    你应该知道它可能有风险,所以在使用它之前要三思而后行。

    <system.web>
      <httpRuntime requestPathInvalidCharacters="" />
      <pages validateRequest="false" />
    </system.web>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2016-11-01
      • 2011-10-13
      • 2011-09-13
      相关资源
      最近更新 更多