WCF自定义客户端检查器

问题描述 投票:0回答:1

外部公司给了我一个消费的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;
    }
}

其次,虽然服务确实返回映射对象,但其中一个对象包含一个在CDATA中推送的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)   
    }
}
wcf
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.