外部公司给了我一个消费的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)
}
}
首先,每个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;
}
以下是一些可能对您有用的链接。
Adding custom SOAP headers from Silverlight client
https://weblogs.asp.net/paolopia/handling-custom-soap-headers-via-wcf-behaviors