WCF - 自定义响应消息

时间:2012-01-22 20:50:39

标签: .net wcf xsd

我获得了这样的XSD服务响应:

<xs:element name="AddEditResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="1" maxOccurs="1" name="response" type="xs:boolean"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

请注意,响应消息中唯一元素的名称是“response”。

[ServiceContract]
[XmlSerializerFormat]
public interface IService
{
    [OperationContract]
    [return:XmlElement("return")]
    bool AddEdit(MultipleElements elements);
}

我将XmlElement属性应用于AddEdit操作的返回值,但我仍然得到以下XSD:

<xs:element name="AddEditResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="1" maxOccurs="1" name="AddEditResult" type="xs:boolean"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

无论[return:XmlElement]属性中的名称如何,AddEditResponse元素内部元素的名称都保持不变。

为什么会这样?有没有办法在WCF中自定义数据交换格式的这些细节?

感谢。

1 个答案:

答案 0 :(得分:2)

我会通过让svcutil为我建立合同来解决这个问题。看看它是否有帮助......

使用您拥有的模式至少生成一个WSDL文件,该文件与您的AddEdit方法匹配。

一旦你有了这个,用类似的命令行运行svcutil(在我的例子中,我使用的工具生成三个引用XSD文件的WSDL文件):

svcutil /mc AddEditSoapHttp.wsdl AddEditSoapBinding.wsdl AddEditInterface.wsdl WCF-WSDLFirst.xsd

结果应该是这样的:

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Generating files...
....\AddEditSoapHttpService.cs
....\output.config

查看生成的代码,找到问题的答案(也许更多)。

对于此XSD(以请求/响应对为例):

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="AddEditRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="1" maxOccurs="1" name="request" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="AddEditResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="1" maxOccurs="1" name="response" type="xs:boolean"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

我收到了(我只发布一个摘录):

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://tempuri.org/ifx/addedit/interface/1/", ConfigurationName="AddEditPortType")]
public interface AddEditPortType
{

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ifx/addedit/bindings/1/AddEdit", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    AddEditResponse1 AddEdit(AddEditRequest1 request);
}