【问题标题】:.NET WCF serialization issues.NET WCF 序列化问题
【发布时间】:2011-04-20 13:06:46
【问题描述】:

情况:系统 A 应该公开 SOAP 1.2 Web 服务以供系统 B 调用。为了让 A 知道消息的样子,B 向 A 发送了一个描述消息内容的 XSD。 A 使用 .NET xsd.exe 工具生成了存根,围绕它创建了简单的 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)的测试消息是什么样的 - WORKS:

<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 构建的 webservice 接收到 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 生成的代理。任何想法/指针/帮助将不胜感激!

【问题讨论】:

  • 注意:上面的 XML 示例是整个消息的摘录,显然这包括更多与 SOAP 相关的内容,但为简洁起见,我将其省略了。
  • 为什么要发送 XSD?为什么不直接使用“添加服务参考”?
  • 我也有同样的反应,但是我在为一家公司做咨询,这家公司在我的故事中是系统B,所以我避免了冲突,顺从了。
  • 其实这是一种颠倒的工作方式;我没有让客户遵守合同 (WSDL),而是修改了合同以使客户工作。有人可能会说这是愚蠢的,而且“做错了”。
  • @pHk:我认为这是不可维护的,不符合标准,并且有悖于您客户的长期利益。

标签: c# .net wcf xml-serialization


【解决方案1】:

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

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

[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/

【讨论】:

    【解决方案2】:

    (这其实是个评论,但是放不下)

    尝试将 system.diagnostics 添加到您的 web.config 以了解有关错误的更多信息:

        <system.diagnostics>
        <trace autoflush="true" />
        <sources>
            <source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
                <listeners>
                    <add name="sdt"
                        type="System.Diagnostics.XmlWriterTraceListener"
                        initializeData= "C:\MyLog.svclog" />
                </listeners>
            </source>
        </sources>
        </system.diagnostics>
    

    您可以使用C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcTraceViewer.exe(或类似方法)查看 svclog。将此添加到两个服务(当然是不同的日志文件名),然后查看哪个失败,以及确切原因。

    我怀疑序列化没问题,但是服务的某些绑定/设置会导致调用失败。

    【讨论】:

    • 好的,典型的,但我想我找到了一个似乎可行的解决方案,需要做更多的测试,BRB :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2011-05-02
    • 2012-02-19
    相关资源
    最近更新 更多