Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在为WCF服务使用XmlSerializerFormat时,如何避免包装?_C#_.net_Wcf_Serialization - Fatal编程技术网

C# 在为WCF服务使用XmlSerializerFormat时,如何避免包装?

C# 在为WCF服务使用XmlSerializerFormat时,如何避免包装?,c#,.net,wcf,serialization,C#,.net,Wcf,Serialization,我正在使用WCF创建一个soapweb服务,其中包含预定义的XSD契约,以及从该XSD自动生成的C#type [ServiceContract] [XmlSerializerFormat] public interface IEBooking10 { [OperationContract] [XmlSerializerFormat] OTA_CancelRS OTA_Cancel(OTA_CancelRQ rq); } OTA_CancelR

我正在使用WCF创建一个soapweb服务,其中包含预定义的XSD契约,以及从该XSD自动生成的C#type

 [ServiceContract]
 [XmlSerializerFormat]
 public interface IEBooking10
 {
       [OperationContract]
       [XmlSerializerFormat]
       OTA_CancelRS OTA_Cancel(OTA_CancelRQ rq);
 }
OTA_CancelRQ&OTA_取消器是自动生成的类型,具有相应的XML序列化属性。 参数包装在OTA_Cancel和OTA_CancelResponse元素中,如下所示:

<OTA_Cancel>
   <OTA_CancelRQ> ... </OTA_CancelRQ>
</OTA_Cancel>
[MessageContract(IsWrapped = false)]
public class OTA_CancelRQMessage
{
    [MessageBodyMember]
    public void OTA_CancelRQ { get; set; }
}

[MessageContract(IsWrapped = false)]
public class OTA_CancelRSMessage
{
    [MessageBodyMember]
    public void OTA_CancelRS { get; set; }
}

[ServiceContract]
[XmlSerializerFormat]
public interface IEBooking10
{
   [OperationContract]
   [XmlSerializerFormat]
   OTA_CancelRSMessage OTA_Cancel(OTA_CancelRQMessage rq);
}

... 


... 

如何避免WCF对输入OTA_Cancel操作的参数进行包装?

这不是通过序列化而是通过消息定义来处理的。目前,您使用的是默认值,即序列化数据必须被包装,但操作元素不能被包装。如果要覆盖此行为,必须使用。试着这样做:

<OTA_Cancel>
   <OTA_CancelRQ> ... </OTA_CancelRQ>
</OTA_Cancel>
[MessageContract(IsWrapped = false)]
public class OTA_CancelRQMessage
{
    [MessageBodyMember]
    public void OTA_CancelRQ { get; set; }
}

[MessageContract(IsWrapped = false)]
public class OTA_CancelRSMessage
{
    [MessageBodyMember]
    public void OTA_CancelRS { get; set; }
}

[ServiceContract]
[XmlSerializerFormat]
public interface IEBooking10
{
   [OperationContract]
   [XmlSerializerFormat]
   OTA_CancelRSMessage OTA_Cancel(OTA_CancelRQMessage rq);
}

您确定消息协定可以与XML序列化程序格式一起使用吗?我希望必须使用数据契约格式,但我从未尝试过将两者结合起来。@Programming Hero:是的,我相信它们可以。数据协定控制数据的序列化,但消息协定控制消息本身。消息中的数据仍由选定的序列化方法序列化。它起作用:)轻微更正,属性不能无效,将“public void OTA_CancelRQ{get;set;}”更改为public“OTA_CancelRQ OTA_CancelRQ{get;set;}”,并用于响应。