我有一个相当过时的程序集,我用来通过SOAP与我公司编写的软件进行通信。现在看来,更新程序集不是一个选项,所以请不要建议。
在之前的迭代中,使用MS Soap Toolkit 3.0(MSSOAPLIB30)完成了正常的通信方法。您将调用程序集的login()方法,它将返回从IHeaderHandler派生的实例,然后您将分配给soap客户端的实例。 Please refer here for more information on how this worked.
好吧,我想使用更新的方法与此Web服务进行通信。到目前为止,我已经能够使用wcf成功引用Web服务,但是我遇到了解决如何将IHeaderHandler实例桥接到wcf代理可以理解的问题的问题。换句话说,我正试图将两代技术结合在一起。我已经确认使用上面链接中提到的方法确实有效。现在只需要弄清楚如何使这个IHeaderHandler实例变得有用。
以下是旧方法的一些示例代码:
string strBasicWsdlUrl = "http://" + _strDeviceName + "/MetasysIII/WS/TimeManagement/TimeService.asmx";
object[] Parameters1 = new object[] { strBasicWsdlUrl, "", "", "" };
bool[] Parameters2 = new bool[] { true, true, true, true };
TSClient = Activator.CreateInstance(Type.GetTypeFromProgID("MSSOAP.SoapClient30"));
NewLateBinding.LateGet(TSClient, null, "MSSoapInit", Parameters1, null, null, Parameters2);
Parameters1 = new object[] { NewLateBinding.LateGet(JCISecurity, null, "HeaderHandler", new object[0], null, null, null) };
NewLateBinding.LateSet(TSClient, null, "HeaderHandler", Parameters1, null, null);
正如您所看到的,soap客户端的一个新实例是使用wsdl文件初始化的,然后是来自JCISecurity实例的HeaderHandler属性(这是我用来通过软件进行身份验证的上述程序集),该实例派生自IHeaderHandler传递给soap客户端的HeaderHandler。然后,此过程确保来自soap客户端的所有未来请求都附加了此标头。
同样重要的是要注意,从WCF为我的Web服务生成的代理类有两个附加到所有Web方法的有趣参数:EncryptedCertificate和LoginResult。我假设这些值将存在于IHeaderHandler实例中,因为该服务的原始文档未引用这两个参数。但是,我无法验证是否是这种情况,因为我还没有能够弄清楚如何访问IHeaderHandler实例中嵌入的内容。
目前,我看到了两种可能的解决方案:找出一种方法,使WCF代理类直接使用与程序集一起生成的IHeaderHandler实例,或找出从IHeaderHandler实例中提取必要信息的方法并使用Message Inspectors手动将详细信息附加到标题。
答案 0 :(得分:1)
WCF非常易于扩展。其中一个扩展点是Message Inspectors:
消息检查器是一个可扩展性对象,可以在服务模型的客户端运行时和调度运行时以编程方式或通过配置使用,并且可以在收到消息后或在消息发送之前检查和更改消息。