gpt4 book ai didi

c# - .NET WCF 序列化问题

转载 作者:太空狗 更新时间:2023-10-29 23:03:04 25 4
gpt4 key购买 nike

情况:系统A应该公开SOAP 1.2 web服务供系统B调用。为了让 A 知道消息的内容,B 向 A 发送了一个描述消息内容的 XSD。 A 使用 .NET xsd.exe 工具生成了 stub ,围绕它创建了简单的 Web 服务,然后工作就完成了。

但是;当 B 调用此 web 服务时,A 拒绝将 SOAP/XML 内容序列化到生成的代理类实例。我意识到这一定是由于在系统 A 的 Web 服务端定义序列化的方式,但一直无法准确定位出问题所在。

来自 B 的消息是什么样的(匿名)- 失败:

<ns2:Set_Out xmlns:ns2="http://a.a/1.0" xmlns:ns1="http://b.b/1.0" xmlns:ns0="http://c.c">
<Context xmlns="">
<Foo>test</Foo>
<Bar>test</Bar>
...
</Context>

来自测试客户端(基于 WSDL)的测试消息是什么样的 - 有效:

<Set_Out xmlns="http://a.a/1.0">
<Context xmlns:b="http://schemas.datacontract.org/2004/07/x.x" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<b:Foo>TEST</b:Foo>
<b:Bar>test</b:Bar>
...
</Context>

当 A 构建的 web 服务收到 B 的消息时,它根本不序列化消息。代理的对象(例如 Context)是 null。当它收到来自测试客户端的消息时,一切都会正确生成。

代理上的序列化属性:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://a.a/1.0")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://a.a/1.0", IsNullable=false)]
[System.ServiceModel.MessageContract]
public partial class Set_Out {
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://a.a/1.0", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] [System.ServiceModel.MessageBodyMember(Order=0)]
public ContextType Context;
...

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://a.a/1.0")]
public partial class ContextType {
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Foo;

我觉得奇怪的事情:

  1. 在为此服务生成 WSDL 时,WSDL 将自己的命名空间添加到 WSDL 定义中(例如,上例中的 xmlns:b)。
  2. WSDL 不遵守代理中定义的 unqualified 注释,并使所有内容都合格。

我尝试了各种注释组合,但似乎没有任何帮助;来自 B 的消息未正确反序列化为 A 生成的代理。任何想法/指针/帮助将不胜感激!

最佳答案

在“提出问题,5 分钟后自己解决”的典型案例中,我设法解决了我的问题。

问题是,显然,在使用 WCF 时,.NET 对数据协定中涉及的类使用默认序列化程序。这个默认的序列化程序(我相信它是 DataContractSerializer)显然并没有真正允许太多的配置方式。我必须告诉 WCF 使用 XmlSerializer 来序列化消息。为此,我必须将 [XmlSerializerFormat()] 注释添加到服务契约(Contract)接口(interface)(显然它也适用于操作)。示例:

[ServiceContract(Namespace = "http://a.a/1.0")]
[XmlSerializerFormat()]
public interface IMyWebService
{
[OperationContract()]
void DoStuff(Set_Out message);
}

添加 [XmlSerializerFormat()] 注释后,WSDL 发生了显着变化(正确的命名空间)并且消息被正确序列化。

让我走上正轨的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c7fede29-56c2-4ff3-bd02-48e3e0b2cec1/

关于c# - .NET WCF 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5730809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com