外部公司给我提供了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)
}
}
答案 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;
}
有些链接可能对您有用。
Adding custom SOAP headers from Silverlight client
https://weblogs.asp.net/paolopia/handling-custom-soap-headers-via-wcf-behaviors