.net WCF XmlSerializerFormat和OperationContract:嵌套soap参数序列化
读完这篇文章后,我尝试用XmlSerializerFormat实现这样一个服务:OperationContract。但是我的Soap消息包含一个附加的标记,它是操作参数。我怎样才能去掉那个标签 这是我的服务样本.net WCF XmlSerializerFormat和OperationContract:嵌套soap参数序列化,.net,wcf,xmlserializer,operationcontract,.net,Wcf,Xmlserializer,Operationcontract,读完这篇文章后,我尝试用XmlSerializerFormat实现这样一个服务:OperationContract。但是我的Soap消息包含一个附加的标记,它是操作参数。我怎样才能去掉那个标签 这是我的服务样本 [System.ServiceModel.ServiceContractAttribute(Namespace = "http://mynamespace.com/", ConfigurationName = "ConfigName")] public interface MyInter
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://mynamespace.com/", ConfigurationName = "ConfigName")]
public interface MyInterfacePort
{
[System.ServiceModel.OperationContractAttribute(Action = "http://mynamespace.com/opName", ReplyAction = "*")]
[System.ServiceModel.FaultContractAttribute(typeof(MyError), Action = "http://mynamespace.com/opName", Name = "opErr")]
[System.ServiceModel.XmlSerializerFormatAttribute()]
opResponse opName(opRequest request);
然后,序列化请求:
[System.Serializable]
public partial class opRequest
{
public string myProperty;
生成的soap消息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<opName xmlns="http://mynamespace.com/">
<request>
<myProperty>262157</myProperty>
</request>
</opName>
</s:Body>
</s:Envelope>
262157
我的服务不处理附加标签
感谢您的帮助。如果要删除XML请求中的附加元素,可以使用未包装的[MessageContract]
类。下面的代码显示了您使用此类合同的示例
public class StackOverflow_7607564
{
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://mynamespace.com/", ConfigurationName = "ConfigName")]
public interface MyInterfacePort
{
[System.ServiceModel.OperationContractAttribute(Action = "http://mynamespace.com/opName", ReplyAction = "*")]
[System.ServiceModel.FaultContractAttribute(typeof(MyError), Action = "http://mynamespace.com/opName", Name = "opErr")]
[System.ServiceModel.XmlSerializerFormatAttribute()]
opNameResponse opName(opNameRequest request);
}
public class MyError { }
[MessageContract(IsWrapped = false)]
public class opNameRequest
{
[MessageBodyMember(Name = "opName")]
public opRequest request;
}
[MessageContract(IsWrapped = false)]
public class opNameResponse
{
[MessageBodyMember(Name = "opNameResponse")]
public opResponse response;
}
[System.Serializable]
public partial class opRequest
{
public string myProperty;
}
[System.Serializable]
public partial class opResponse
{
public string myProperty;
}
public class Service : MyInterfacePort
{
public opNameResponse opName(opNameRequest request)
{
return new opNameResponse { response = new opResponse { myProperty = request.request.myProperty } };
}
}
public static void Test()
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(MyInterfacePort), new BasicHttpBinding(), "");
host.Open();
Console.WriteLine("Host opened");
var factory = new ChannelFactory<MyInterfacePort>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
var proxy = factory.CreateChannel();
Console.WriteLine(proxy.opName(new opNameRequest { request = new opRequest { myProperty = "hello world" } }).response.myProperty);
((IClientChannel)proxy).Close();
factory.Close();
Console.Write("Press ENTER to close the host");
Console.ReadLine();
host.Close();
}
}
公共类StackOverflow_7607564
{
[System.ServiceModel.ServiceContractAttribute(命名空间=”http://mynamespace.com/,ConfigurationName=“ConfigName”)]
公共接口MyInterfacePort
{
[System.ServiceModel.OperationContractAttribute(操作=”http://mynamespace.com/opName“,ReplyAction=“*”)]
[System.ServiceModel.FaultContractAttribute(typeof(MyError),Action=”http://mynamespace.com/opName“,Name=“oper”)]
[System.ServiceModel.XmlSerializerFormatAttribute()]
opNameResponse opName(opNameRequest请求);
}
公共类MyError{}
[MessageContract(IsWrapped=false)]
公共类opNameRequest
{
[MessageBodyMember(Name=“opName”)]
公开请求;
}
[MessageContract(IsWrapped=false)]
公共类opNameResponse
{
[MessageBodyMember(Name=“opnamesponse”)]
公共行动响应;
}
[系统可序列化]
公共部分类操作
{
公共财产;
}
[系统可序列化]
公共部分类操作响应
{
公共财产;
}
公共类服务:MyInterfacePort
{
公共opNameResponse opName(opNameRequest请求)
{
返回新的opnamesponse{response=newopresponse{myProperty=request.request.myProperty};
}
}
公共静态无效测试()
{
string baseAddress=“http://“+Environment.MachineName+”:8000/服务”;
ServiceHost主机=新ServiceHost(类型(服务),新Uri(基地址));
AddServiceEndpoint(typeof(MyInterfacePort),新的BasicHttpBinding(),“”);
host.Open();
Console.WriteLine(“主机已打开”);
var factory=newchannelfactory(new BasicHttpBinding(),newendpointaddress(baseAddress));
var proxy=factory.CreateChannel();
Console.WriteLine(proxy.opName(new opNameRequest{request=new opRequest{myProperty=“hello world”}).response.myProperty);
((IClientChannel)代理).Close();
工厂关闭();
控制台。写入(“按ENTER键关闭主机”);
Console.ReadLine();
host.Close();
}
}
这通常是svcutil作为适配器生成的,但对于messageContract,您不能使用可选字段。每个消息体都将被发送到服务。我的需求就像引用的post(),其中“degorolls”建议不要使用MessageContract。