Web服务失败,因为(400)由于特殊字符的错误请求

时间:2009-06-11 23:20:06

标签: c# .net asp.net winforms

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

我使用List作为Method的参数。 经过大量实验,我使用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知识库文章,它基本上说明了安装一个hotfix。这真的不是可以解决问题的方法,所以我想知道是否有任何关于如何解决这个问题的想法?

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

由于

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

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

4 个答案:

答案 0 :(得分:3)

我的网络服务遇到了类似问题,我们的应用用户运行在线帐户搜索。我找到了一个VS Feedback item about this,但MS似乎在考虑这种行为。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

该KB文章指的是请求URL中的unicode字符集,而不是发布到服务器的实际数据。

有人说;我会验证你的标题是否格式正确。

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

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

答案 3 :(得分:0)

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