更改WCF生成的SOAP

时间:2015-02-12 11:27:41

标签: c# wcf soap

请告诉我如何改变一点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>...
    ...

2 个答案:

答案 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的文章中都有! 在所有这些中,使用嵌套的复杂类型,到处都出现了这个神器!只看一下,注意它。但是,就文章而言,这个工件并不重要。因此,没有人关注。 不幸的是,这个错误至关重要。