2009-06-11 101 views
1

使用Visual Studio 2008,我设置了一个使用Web服务的客户端。 它与缓冲区大小无关(因为这是一个典型的响应,所有适当的大小都增加了)。由于特殊字符(400)错误请求导致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个错误请求。

现在,我发现了一个Microsoft知识库文章,它描述了基本上指出的安装hotfix的bug kb911276。这真的不是问题的解决方案,所以我想知道是否有任何想法来解决这个问题?

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

感谢

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

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

回答

3

我有一个web服务类似的问题,我们的应用程序的用户运行在线帐户搜索。我发现一个VS Feedback item about this,但它似乎认为这种行为的设计。

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

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

我想如果你不能做到这一点,数据应该在运输过程中base64编码,以避免这个问题。对我来说似乎有点奇怪,因为它打破了通过Web服务无损发送呼叫的能力。

0

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

+0

列表与T []对我意识到的ASMX中的序列化没有影响。 – 2009-08-12 19:17:50

0

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

这就是说;我会确认你的头文件格式正确。

此外,如果VS为您生成客户端代理;右键点击服务参考,然后点“更新服务参考”

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

0

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

相关问题