内部复杂类型中不正确的 Soap 名称空间
Incorrect Soap's namespaces in inner complex types
我正在使用 MessageContract。
此处生成了错误的 SOAP 消息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
...
</s:Header>
<s:Body>
<BoolValue xmlns="http://my.site/rev2015">true</BoolValue>
<StringValue xmlns="http://my.site/rev2015">HelloWorld</StringValue>
<InnerType xmlns="http://my.site/rev2015" xmlns:a="http://schemas.datacontract.org/2004/07/Server" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:ANotherBool>true</a:ANotherBool>
<a:AnotherStringValue>AnotherHelloWorld</a:AnotherStringValue>
</InnerType>
</s:Body>
</s:Envelope>
<a:ANotherBool>, <a:AnotherStringValue> - 不正确。命名空间必须是“http://my.site/rev2015”。
这是我的代码:
[ServiceContract(Namespace = "http://my.site/rev2015")]
[ServiceKnownType(typeof(InnerType))]
public interface IService1
{
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[MessageContract(WrapperNamespace = "http://my.site/rev2015", IsWrapped = false)]
public class CompositeType
{
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public bool BoolValue;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public string StringValue;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public InnerType InnerType;
}
[MessageContract(WrapperNamespace = "http://my.site/rev2015", IsWrapped = false)]
public class InnerType
{
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public bool ANotherBool;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public string AnotherStringValue;
}
// impl
[ServiceBehavior(Namespace = "http://my.site/rev2015")]
public class Service1 : IService1
{
public CompositeType GetDataUsingDataContract(CompositeType composite)
{...}
}
怎么做?
必须
[ServiceContract(Namespace = "http://my.site/rev2015")]
[XmlSerializerFormat]
public interface IService1
{
[OperationContract]
[XmlSerializerFormat]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[MessageContract(WrapperNamespace = "http://my.site/rev2015", IsWrapped = true)]
public class InnerType
{
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public bool ANotherBool;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public string AnotherStringValue;
}
1.XmlSerializerFormat
2.IsWrapped = 真
我正在使用 MessageContract。
此处生成了错误的 SOAP 消息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
...
</s:Header>
<s:Body>
<BoolValue xmlns="http://my.site/rev2015">true</BoolValue>
<StringValue xmlns="http://my.site/rev2015">HelloWorld</StringValue>
<InnerType xmlns="http://my.site/rev2015" xmlns:a="http://schemas.datacontract.org/2004/07/Server" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:ANotherBool>true</a:ANotherBool>
<a:AnotherStringValue>AnotherHelloWorld</a:AnotherStringValue>
</InnerType>
</s:Body>
</s:Envelope>
<a:ANotherBool>, <a:AnotherStringValue> - 不正确。命名空间必须是“http://my.site/rev2015”。
这是我的代码:
[ServiceContract(Namespace = "http://my.site/rev2015")]
[ServiceKnownType(typeof(InnerType))]
public interface IService1
{
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[MessageContract(WrapperNamespace = "http://my.site/rev2015", IsWrapped = false)]
public class CompositeType
{
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public bool BoolValue;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public string StringValue;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public InnerType InnerType;
}
[MessageContract(WrapperNamespace = "http://my.site/rev2015", IsWrapped = false)]
public class InnerType
{
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public bool ANotherBool;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public string AnotherStringValue;
}
// impl
[ServiceBehavior(Namespace = "http://my.site/rev2015")]
public class Service1 : IService1
{
public CompositeType GetDataUsingDataContract(CompositeType composite)
{...}
}
怎么做?
必须
[ServiceContract(Namespace = "http://my.site/rev2015")]
[XmlSerializerFormat]
public interface IService1
{
[OperationContract]
[XmlSerializerFormat]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[MessageContract(WrapperNamespace = "http://my.site/rev2015", IsWrapped = true)]
public class InnerType
{
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public bool ANotherBool;
[MessageBodyMember(Namespace = "http://my.site/rev2015")]
public string AnotherStringValue;
}
1.XmlSerializerFormat
2.IsWrapped = 真