更改 WCF 生成的 SOAP

Change SOAP produced by WCF

请告诉我如何改变一点肥皂。

事情是这样的:

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

您可能会查看接口 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 class,例如:

public class SOAPEndpointBehaviour : IEndpointBehavior {

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
      clientRuntime.MessageInspectors.Add(new SOAPInspector());
    }
}

最后注册你的行为

yourServiceClient.Endpoint.EndpointBehaviors.Add(new SOAPEndpointBehaviour());

解决方案是使用 MessageContract 但。从试图用它解决问题 - 与另一个相撞:

这很有趣。我遇到的问题,大部分描述MessageContract的文章都有! 在所有这些使用嵌套复杂类型的人身上,处处体现着这个神器!随便看看,注意 it.But,对于本文而言,这个工件并不重要。因此,无人问津。 不幸的是,这个错误很严重。