C# 序列化.NET WCF服务的类型时出现问题:服务WSDL在XSD中定义空类型

C# 序列化.NET WCF服务的类型时出现问题:服务WSDL在XSD中定义空类型,c#,.net,wcf,web-services,serialization,C#,.net,Wcf,Web Services,Serialization,我正在使用WCF编写一个web服务 我创建了数据契约 我创建了我的服务合同(接口)。我定义了方法(其参数类型与数据契约相同) 我实现了服务契约,创建了一个服务类 我使用svc文件和IIS托管了我的服务 我尝试了我的服务,查找-->服务是否已加载,然后显示了一个描述我的服务存在的漂亮网页 我想看看WSDL。使用提供的链接,我可以看到类型只被定义,我可以看到类型定义(如),但里面什么都没有(类型是空的) 我编写了一个简单的客户端,对一个操作的调用进行得很好,但是当返回类型时它是空的(内部字段具有构造

我正在使用WCF编写一个web服务

  • 我创建了数据契约

  • 我创建了我的服务合同(接口)。我定义了方法(其参数类型与数据契约相同)

  • 我实现了服务契约,创建了一个服务类

  • 我使用svc文件和IIS托管了我的服务

  • 我尝试了我的服务,查找-->服务是否已加载,然后显示了一个描述我的服务存在的漂亮网页

  • 我想看看WSDL。使用提供的链接,我可以看到类型只被定义,我可以看到类型定义(如
    ),但里面什么都没有(类型是空的)

  • 我编写了一个简单的客户端,对一个操作的调用进行得很好,但是当返回类型时它是空的(内部字段具有构造值,而我的服务将一些值放在那里),例如,对一个操作的调用返回一个类型,该类型由操作契约方法设置为“Hello”、“Hello2”和“Hello3”,返回将这些字符串设置为
    ”的类型(构造值,就好像没有发生任何更改一样)

  • 发生了什么事

    序列化似乎失败了

    我提供一些:

    A1)服务合同的一部分:

    [ServiceContract(Namespace = "http://opcfoundation.org/webservices/XMLDA/1.0/")]
       public interface IOCXSService {
          [OperationContract(Action = "http://opcfoundation.org/webservices/XMLDA/1.0/Browse")]
          BrowseResponse Browse(BrowseRequest request);
          ...
    }
    
    A2)服务实施:

    public class MyService : IOCXSService {
          ...
          public BrowseResponse Browse(BrowseRequest request) {
             ...
          }
          ...
       }
    
    B) 类型:

    C) WSDL(一部分,关于类型定义的部分)

    
    -
    
    以上内容包括在这里:

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:tns="http://opcfoundation.org/webservices/XMLDA/1.0/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://opcfoundation.org/webservices/XMLDA/1.0/">
    <wsdl:types>
    <xsd:schema targetNamespace="http://opcfoundation.org/webservices/XMLDA/1.0/Imports">
    <xsd:import namespace="http://opcfoundation.org/webservices/XMLDA/1.0/" schemaLocation="http://localhost/OCXS/OCXS.svc?xsd=xsd0"/></xsd:schema></wsdl:types>
    <wsdl:message name="BrowseRequest"><wsdl:part name="parameters" element="tns:Browse"/></wsdl:message>
    <wsdl:message name="BrowseResponse"><wsdl:part name="parameters" element="tns:BrowseResponse"/></wsdl:message>
    <wsdl:message name="GetPropertiesRequest"><wsdl:part name="parameters" element="tns:GetProperties"/></wsdl:message>
    <wsdl:message name="GetPropertiesResponse"><wsdl:part name="parameters" element="tns:GetPropertiesResponse"/></wsdl:message>
    <wsdl:message name="GetStatusRequest"><wsdl:part name="parameters" element="tns:GetStatus"/></wsdl:message>
    <wsdl:message name="GetStatusResponse"><wsdl:part name="parameters" element="tns:GetStatusResponse"/></wsdl:message>
    <wsdl:message name="ReadRequest"><wsdl:part name="parameters" element="tns:Read"/></wsdl:message>-<wsdl:message name="ReadResponse"><wsdl:part name="parameters" element="tns:ReadResponse"/></wsdl:message>
    <wsdl:message name="SubscribeRequest"><wsdl:part name="parameters" element="tns:Subscribe"/></wsdl:message>
    <wsdl:message name="SubscribeResponse"><wsdl:part name="parameters" element="tns:SubscribeResponse"/></wsdl:message>
    <wsdl:message name="SubscriptionCancelRequest"><wsdl:part name="parameters" element="tns:SubscriptionCancel"/></wsdl:message><wsdl:message name="SubscriptionCancelResponse"><wsdl:part name="parameters" element="tns:SubscriptionCancelResponse"/></wsdl:message>
    <wsdl:message name="SubscriptionPolledRefreshRequest"><wsdl:part name="parameters" element="tns:SubscriptionPolledRefresh"/></wsdl:message>
    <wsdl:message name="SubscriptionPolledRefreshResponse"><wsdl:part name="parameters" element="tns:SubscriptionPolledRefreshResponse"/></wsdl:message>
    <wsdl:message name="WriteRequest"><wsdl:part name="parameters" element="tns:Write"/></wsdl:message>-<wsdl:message name="WriteResponse"><wsdl:part name="parameters" element="tns:WriteResponse"/></wsdl:message>
    <wsdl:portType name="IOCXSService">-<wsdl:operation name="Browse"><wsdl:input name="BrowseRequest" message="tns:BrowseRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Browse"/><wsdl:output name="BrowseResponse" message="tns:BrowseResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/BrowseResponse"/></wsdl:operation>
    <wsdl:operation name="GetProperties"><wsdl:input name="GetPropertiesRequest" message="tns:GetPropertiesRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/GetProperties"/><wsdl:output name="GetPropertiesResponse" message="tns:GetPropertiesResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/GetPropertiesResponse"/></wsdl:operation>
    <wsdl:operation name="GetStatus"><wsdl:input name="GetStatusRequest" message="tns:GetStatusRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/GetStatus"/><wsdl:output name="GetStatusResponse" message="tns:GetStatusResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/GetStatusResponse"/></wsdl:operation>
    <wsdl:operation name="Read"><wsdl:input name="ReadRequest" message="tns:ReadRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Read"/><wsdl:output name="ReadResponse" message="tns:ReadResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/ReadResponse"/></wsdl:operation>-<wsdl:operation name="Subscribe"><wsdl:input name="SubscribeRequest" message="tns:SubscribeRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Subscribe"/><wsdl:output name="SubscribeResponse" message="tns:SubscribeResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/SubscribeResponse"/></wsdl:operation>
    <wsdl:operation name="SubscriptionCancel"><wsdl:input name="SubscriptionCancelRequest" message="tns:SubscriptionCancelRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/SubscriptionCancel"/><wsdl:output name="SubscriptionCancelResponse" message="tns:SubscriptionCancelResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/SubscriptionCancelResponse"/></wsdl:operation>
    <wsdl:operation name="SubscriptionPolledRefresh"><wsdl:input name="SubscriptionPolledRefreshRequest" message="tns:SubscriptionPolledRefreshRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/SubscriptionPolledRefresh"/><wsdl:output name="SubscriptionPolledRefreshResponse" message="tns:SubscriptionPolledRefreshResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/SubscriptionPolledRefreshResponse"/></wsdl:operation>
    <wsdl:operation name="Write"><wsdl:input name="WriteRequest" message="tns:WriteRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Write"/><wsdl:output name="WriteResponse" message="tns:WriteResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/WriteResponse"/></wsdl:operation></wsdl:portType></wsdl:definitions>
    
    
    -
    -
    -
    -
    
    注: 如果我从
    BrowserResponse
    BrowserRequest
    中删除
    MessageContract
    属性(这两个属性都是在运行时变得疯狂时删除的),则问题仍然存在。。。。 这真的是一个关于合同的问题吗

    可能是解决方案

    好了,各位,也许我能看到光。。。 如果我删除了所有
    DataContract
    (s)和
    ServiceContract
    (s)属性名称空间和名称(始终没有
    MessageContract
    (s)),那么一切都正常。嗯,我得到了wsdl和类型,但即使使用它们也不能工作(但总是没有
    MessageContract
    (s))。 原因如下(我想得到您的确认):

    我指定的名称空间:不是一个简单的名称,在这里您可以找到我的操作和类型(已经定义)的WSDL定义。我的svc不会生成具有类型的完整WSDL定义,因为它已经在我提供的名称空间中定义了它们


    您对此有何看法?

    您将BrowserResponse类定义为
    [MessageContract]
    ,以及
    [DataContract]
    。根据您所说的,似乎[MessageContract]优先(这很有意义-[MC]定义了消息的SOAP信封,它可以包含成员,这些成员可以是数据契约。消息契约的成员由
    [MessageHeader]
    [MessageBodyMember]定义
    属性,并且由于您没有任何属性,因此合同基本上是空的


    您没有显示BrowserRequest的定义,但由于您在请求中使用[MC]类型,因此您还需要在响应中使用[MC],因此我假设它也存在相同的问题。

    这是一个非常旧的线程,但可能对某些人有所帮助

    我们的客户端有一个.NET 2.0应用程序,我们创建了一个.NET 4 WCF项目。有一些C#类表示复杂类型。当客户端应用程序添加WebReference并跨数据发送时,我们发现一些属性没有序列化,例如小数,最终我们不得不将序列化程序从默认的seria更改lizer到XmlSerializerFormat,它允许我们使用常规XML序列化程序而不是WCF DataContractSerializer序列化类

    这篇文章对MSDN非常有帮助

    请参见下面的示例,我们没有使用WCF契约属性来允许与Web服务的交互

    <ServiceContract()>
    <XmlSerializerFormat()>
    Public Interface IService    
        <OperationContract()>
        <WebMethod()>
        Function CreateLoan(ByVal LoanRequest As LoanAccount) As String
    End Interface
    
    //C# Class
    public class LoanAccount
    {
        [XmlElement]
        public string New { get; set; }
    
        [XmlElement]
        public String CustomerNo { get; set; }
    
        [XmlElement]
        public string AcctType { get; set; }
    }
    
    
    公共接口设备
    函数CreateLoan(ByVal LoanRequest作为LoanAccount)作为字符串
    端接口
    //C级
    公共类贷款
    {
    [XmlElement]
    公共字符串New{get;set;}
    [XmlElement]
    公共字符串CustomerNo{get;set;}
    [XmlElement]
    公共字符串AcctType{get;set;}
    }
    
    你能发布一个DataContract的示例吗?它是否包含Datamember属性?然后请发布一个项目的C#和WSDL。WSDL中是否还有关于BrowserResponse的另一部分?只有我现在发布的一部分…很抱歉缩进…但是,你对发生的事情有一个大致的了解吗???这是关于namespa的吗ces???或者什么???好的…让我来尝试修复它…我会告诉你结果…一个问题…MessageContract到底做了什么???与DataContract有什么关系?MessageContract并不是广泛使用的东西。通常,当您希望请求/响应的某些部分进入SOAP主体,而某些部分进入SOAP主体时,您会使用它SOAP标头(通常是与现有服务互操作性所必需的)—有关更多信息,请参阅。数据协定用于定义要在客户端和服务器之间交换的数据。消息协定中的成员可以是数据协定类型(反之则不成立)。因此,消息契约用于定义消息形状,而数据契约用于定义消息内容
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:tns="http://opcfoundation.org/webservices/XMLDA/1.0/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://opcfoundation.org/webservices/XMLDA/1.0/">
    <wsdl:types>
    <xsd:schema targetNamespace="http://opcfoundation.org/webservices/XMLDA/1.0/Imports">
    <xsd:import namespace="http://opcfoundation.org/webservices/XMLDA/1.0/" schemaLocation="http://localhost/OCXS/OCXS.svc?xsd=xsd0"/></xsd:schema></wsdl:types>
    <wsdl:message name="BrowseRequest"><wsdl:part name="parameters" element="tns:Browse"/></wsdl:message>
    <wsdl:message name="BrowseResponse"><wsdl:part name="parameters" element="tns:BrowseResponse"/></wsdl:message>
    <wsdl:message name="GetPropertiesRequest"><wsdl:part name="parameters" element="tns:GetProperties"/></wsdl:message>
    <wsdl:message name="GetPropertiesResponse"><wsdl:part name="parameters" element="tns:GetPropertiesResponse"/></wsdl:message>
    <wsdl:message name="GetStatusRequest"><wsdl:part name="parameters" element="tns:GetStatus"/></wsdl:message>
    <wsdl:message name="GetStatusResponse"><wsdl:part name="parameters" element="tns:GetStatusResponse"/></wsdl:message>
    <wsdl:message name="ReadRequest"><wsdl:part name="parameters" element="tns:Read"/></wsdl:message>-<wsdl:message name="ReadResponse"><wsdl:part name="parameters" element="tns:ReadResponse"/></wsdl:message>
    <wsdl:message name="SubscribeRequest"><wsdl:part name="parameters" element="tns:Subscribe"/></wsdl:message>
    <wsdl:message name="SubscribeResponse"><wsdl:part name="parameters" element="tns:SubscribeResponse"/></wsdl:message>
    <wsdl:message name="SubscriptionCancelRequest"><wsdl:part name="parameters" element="tns:SubscriptionCancel"/></wsdl:message><wsdl:message name="SubscriptionCancelResponse"><wsdl:part name="parameters" element="tns:SubscriptionCancelResponse"/></wsdl:message>
    <wsdl:message name="SubscriptionPolledRefreshRequest"><wsdl:part name="parameters" element="tns:SubscriptionPolledRefresh"/></wsdl:message>
    <wsdl:message name="SubscriptionPolledRefreshResponse"><wsdl:part name="parameters" element="tns:SubscriptionPolledRefreshResponse"/></wsdl:message>
    <wsdl:message name="WriteRequest"><wsdl:part name="parameters" element="tns:Write"/></wsdl:message>-<wsdl:message name="WriteResponse"><wsdl:part name="parameters" element="tns:WriteResponse"/></wsdl:message>
    <wsdl:portType name="IOCXSService">-<wsdl:operation name="Browse"><wsdl:input name="BrowseRequest" message="tns:BrowseRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Browse"/><wsdl:output name="BrowseResponse" message="tns:BrowseResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/BrowseResponse"/></wsdl:operation>
    <wsdl:operation name="GetProperties"><wsdl:input name="GetPropertiesRequest" message="tns:GetPropertiesRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/GetProperties"/><wsdl:output name="GetPropertiesResponse" message="tns:GetPropertiesResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/GetPropertiesResponse"/></wsdl:operation>
    <wsdl:operation name="GetStatus"><wsdl:input name="GetStatusRequest" message="tns:GetStatusRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/GetStatus"/><wsdl:output name="GetStatusResponse" message="tns:GetStatusResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/GetStatusResponse"/></wsdl:operation>
    <wsdl:operation name="Read"><wsdl:input name="ReadRequest" message="tns:ReadRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Read"/><wsdl:output name="ReadResponse" message="tns:ReadResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/ReadResponse"/></wsdl:operation>-<wsdl:operation name="Subscribe"><wsdl:input name="SubscribeRequest" message="tns:SubscribeRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Subscribe"/><wsdl:output name="SubscribeResponse" message="tns:SubscribeResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/SubscribeResponse"/></wsdl:operation>
    <wsdl:operation name="SubscriptionCancel"><wsdl:input name="SubscriptionCancelRequest" message="tns:SubscriptionCancelRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/SubscriptionCancel"/><wsdl:output name="SubscriptionCancelResponse" message="tns:SubscriptionCancelResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/SubscriptionCancelResponse"/></wsdl:operation>
    <wsdl:operation name="SubscriptionPolledRefresh"><wsdl:input name="SubscriptionPolledRefreshRequest" message="tns:SubscriptionPolledRefreshRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/SubscriptionPolledRefresh"/><wsdl:output name="SubscriptionPolledRefreshResponse" message="tns:SubscriptionPolledRefreshResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/SubscriptionPolledRefreshResponse"/></wsdl:operation>
    <wsdl:operation name="Write"><wsdl:input name="WriteRequest" message="tns:WriteRequest" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/Write"/><wsdl:output name="WriteResponse" message="tns:WriteResponse" wsaw:Action="http://opcfoundation.org/webservices/XMLDA/1.0/IOCXSService/WriteResponse"/></wsdl:operation></wsdl:portType></wsdl:definitions>
    
    <ServiceContract()>
    <XmlSerializerFormat()>
    Public Interface IService    
        <OperationContract()>
        <WebMethod()>
        Function CreateLoan(ByVal LoanRequest As LoanAccount) As String
    End Interface
    
    //C# Class
    public class LoanAccount
    {
        [XmlElement]
        public string New { get; set; }
    
        [XmlElement]
        public String CustomerNo { get; set; }
    
        [XmlElement]
        public string AcctType { get; set; }
    }