请告诉我如何改变一点SOAP。
以下是发生的事情:
<s: Envelope>
<s: Header>
...
</s: Header>
<s: Body>
<Method1 xmlns="http://my.site">
<Param1 xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
...
MyTestMethod - 是服务方法的名称。在必须 param1。没有Method1的级别。
这里是合同:
[ServiceContract(Namespace = "http://my.site")]
public interface IMyService
{
[OperationContract]
Method1Response Method1(Method1Request param1);
}
我需要
<s: Envelope>
<s: Header>
...
</s: Header>
<s: Body>
<Param1 xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Value1>...
<Value2>...
...
答案 0 :(得分:0)
您可以查看Interface IClientMessageInspector并从中派生。
public class SOAPInspector : IClientMessageInspector {
public void AfterReceiveReply(ref Message reply, object correlationState) {
//Your code
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel) {
//Your code
}
}
使用BeforeSendRequest方法,您可以在发送之前修改生成的SOAP消息。
要让Inspector运行,您还需要一个EndpointBehaviour类,如:
public class SOAPEndpointBehaviour : IEndpointBehavior {
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
clientRuntime.MessageInspectors.Add(new SOAPInspector());
}
}
最后注册你的行为
yourServiceClient.Endpoint.EndpointBehaviors.Add(new SOAPEndpointBehaviour());
答案 1 :(得分:0)
解决方案是使用MessageContract 但。从试图解决它的问题 - 与另一个相撞: Incorrect Soap's namespaces in inner complex types
这很有趣。我遇到的问题,在大多数描述MessageContract的文章中都有! 在所有这些中,使用嵌套的复杂类型,到处都出现了这个神器!只看一下,注意它。但是,就文章而言,这个工件并不重要。因此,没有人关注。 不幸的是,这个错误至关重要。