Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
.net WCF XmlSerializerFormat和OperationContract:嵌套soap参数序列化_.net_Wcf_Xmlserializer_Operationcontract - Fatal编程技术网

.net WCF 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

读完这篇文章后,我尝试用XmlSerializerFormat实现这样一个服务:OperationContract。但是我的Soap消息包含一个附加的标记,它是操作参数。我怎样才能去掉那个标签

这是我的服务样本

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