WCF自定义客户端检查器

时间:2018-09-18 18:03:15

标签: wcf

外部公司给我提供了WSDL以供使用,它具有一些我不想影响客户代码的奇怪特征。

首先,每个OperationContract都需要发送相同的用户名参数。与其每次都在客户端代码中进行设置,我不希望在全局范围内进行设置。

我认为最好将其设置在IClientMessageInspector中,但是,由于这是SOAP服务,因此我对如何将其添加到正文中感到有些困惑。

public class CustomInspector : IClientMessageInspector
{
    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        // Add an additional parameter to the SOAP body

        return null;
    }
}

第二,虽然服务确实返回了映射的对象,但其中一个对象包含一个Cxml中塞满的xml文档:(

<a:ResponseData>

     <![CDATA[ INSERT XML DOCUMENT HERE]]>

</a:ResponseData>

我正在寻找提取XML并添加回去而没有CDATA和XML声明的方法,因此我可以在响应对象上添加适当的属性。这样,它应该像正常情况一样反序列化(希望如此)

public class CustomInspector : IClientMessageInspector
{
    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        // Get the XML from the ResponseData element and remove the CDATA. Add the XML back in (Minus the <xml> declaration)   
    }
}

1 个答案:

答案 0 :(得分:0)

  

首先,每个OperationContract需要相同的用户名参数   发送过来。而不是每次都在我的客户代码中进行设置   喜欢在全球范围内这样做。我相信将其设置为   IClientMessageInspector是我最好的选择,但是这是   SOAP服务对于如何将其添加到正文中,我有些困惑。

如果要在消息中添加自定义消息头,则可以参考以下代码。

public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
{
    request.Headers.Add(MessageHeader.CreateHeader("username", "", "user"));
    request.Headers.Add(MessageHeader.CreateHeader("password", "", "pass"));
    return null;
}

看看IClientMessageInspector

有些链接可能对您有用。

Adding custom SOAP headers from Silverlight client

https://weblogs.asp.net/paolopia/handling-custom-soap-headers-via-wcf-behaviors

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f1f29779-0121-4499-a2bc-63ffe8025b21/wcf-security-soap-header