【问题标题】:WebServices fail because (400) Bad Request because of special characterWebServices 失败,因为 (400) Bad Request 由于特殊字符
【发布时间】:2009-06-12 23:34:14
【问题描述】:

使用 Visual Studio 2008,我设置了一个使用 Web 服务的客户端。 它与缓冲区大小无关(因为这是一个典型的响应,所有适当的大小都增加了)。

我使用列表作为方法的参数。 经过大量实验,我使用 System.Net.WebClient 手动创建了一个 Soap 1.1 和一个 Soap 1.2 请求来测试测试结果。

using (var webCtx = new System.Net.WebClient())
{
  webCtx.Headers.Add(System.Net.HttpRequestHeader.ContentType, "text/xml");
  webCtx.Headers.Add("SOAPAction", "http://tempuri.org/HelloWorld");
  var uri = new Uri("http://localhost:12345/MyProject/WebService.asmx");
  MessageBox.Show(webCtx.UploadString(uri, xml));
}

其中 xml 是带有实际数据的 xml 的字符串变量。 问题是当其中一个字段具有特殊字符时。这是xml的消息体示例。

<PocoClass>
  <UnicodeString>&#xE;123</UnicodeString>
</PocoClass>

如果 UnicodeString 的值很简单(即 123),但一旦出现特殊字符,我得到 400 Bad Request。

现在,我找到了描述错误kb911276 的Microsoft 知识库文章,其中基本上说明了安装热修复程序。那真的不是可以解决问题的方法,所以我想知道是否有任何想法如何解决这个问题?

是编写某种自定义编码/解码或自定义绑定以由服务器和客户端实现的唯一解决方案吗?有没有更简单的想法?

谢谢

已编辑: List 的使用不是问题,因为它由 VS 处理。这是肥皂消息的更完整(但仍然是部分)内容。

<HelloWorld xmlns="http://tempuri.org/">
  <pocoList>
    <PocoClass>
      <UnicodeString>&#xE;123</UnicodeString>
    </PocoClass>
  </pocoList>
</HelloWorld>

【问题讨论】:

    标签: c# .net asp.net winforms


    【解决方案1】:

    我的应用程序用户运行在线帐户搜索的网络服务也遇到了类似的问题。我找到了VS Feedback item about this,但似乎 MS 认为这种行为是设计使然。

    我们最终做的是编写一个方法,用问号替换序列化为 XML 时不允许使用的所有字符。

    允许的列表是:0x09、0x0a、0x0d、0x20-0xd7ff 和 0xe000-0xfffd。其他一切,我们转向“?”。

    我想如果你不能这样做,数据应该在传输过程中进行 base64 编码以避免这个问题。我觉得有点奇怪,因为它破坏了通过 Web 服务无损路由呼叫的能力。

    【讨论】:

      【解决方案2】:

      我担心的是您在哪里声明您使用 List 作为方法的参数。 Web 服务不直接支持列表。您需要使用数组作为参数。然后在内部您可以使用 .ToList() 将其转换为列表。这可能不是您的直接问题!

      【讨论】:

      • List 与 T[] 对我所知道的 ASMX 中的序列化没有影响。
      【解决方案3】:

      那篇知识库文章指的是请求 URL 中的 unicode 字符集,而不是发布到服务器的实际数据。

      话虽如此;我会验证您的标题格式是否正确。

      另外,如果 VS 为你生成了客户端代理;右键单击服务参考,然后单击“更新服务参考”

      又注意到一件事;你说你正在传递一个列表作为参数;从显示的 xml 的 sn-p 来看,这看起来不像是从列表中序列化的东西(通过任何 .NET xml 序列化程序);如果您想使用 webclient 方法进行调试;尝试验证 xml 的格式是否有效。

      【讨论】:

        【解决方案4】:

        你在哪里看到&amp;#xE;?在原始 XML 或序列化数据中? XML 被定义为仅包含人类可读的字符,&amp;#xE; 是不可读的 ASCII 移出字符的 XML 实体。如果您正在查看原始 XML 并且它包含 XML 实体代码,这是允许的,但如果您正在查看序列化数据并且您的 XML 文档包含原始控制字符,则它是无效的并且将被拒绝。

        【讨论】:

          猜你喜欢
          • 2017-03-16
          • 1970-01-01
          • 2020-11-16
          • 1970-01-01
          • 2017-02-25
          • 1970-01-01
          • 2019-07-02
          • 2020-10-26
          • 2014-04-06
          相关资源
          最近更新 更多