5

我有 4 个门户(WW、EU、AU、US),每个门户都有自己的 Web 服务(通过 PHP,这意味着我无法控制)。

对于这 4 个 Web 服务,我有 4 个客户端(由 VS.Net Add Web Reference 生成)。

有一个方法叫它CommonMethod,在所有 Web 服务上都是一样的,返回一个类型为 的对象CommonClass

  • 当我调用该方法(使用 EU 代理类)时,我得到一个 InvalidOperationException There is an error in XML document (2, 615).,并且 InnerException 说“无法将 NS.com.AU.CommonClass 类型的对象分配给 NS.com.EU.CommonClass 类型的对象。”。
  • 当我调用该方法(使用美国代理类)时,我得到一个 InvalidOperationException There is an error in XML document (2, 615).,并且 InnerException 说“无法将 NS.com.AU.CommonClass 类型的对象分配给 NS.com.US.CommonClass 类型的对象。”。
  • 当我调用该方法(使用 AU 代理类)时,不会引发异常。
  • 当我调用该方法(使用 WW 代理类)时,我得到一个 InvalidOperationException There is an error in XML document (2, 615).,并且 InnerException 说“无法将 NS.com.AU.CommonClass 类型的对象分配给 NS.com.WW.CommonClass 类型的对象。”。

我在网上搜索了这样的错误,它是 XML,所以出现了很多不相关的东西,找不到有用的东西。

现在我注意到,这 4 个 Web 服务在其 WSDL 文档中使用相同的命名空间 (xmlns:tns="urn:rambo.com:RamboComApi")。这可能是混淆和类型转换异常的根源吗?我应该告诉 Web 服务的作者为每个 Web 服务选择不同的命名空间吗?

4

1 回答 1

2

Web 服务可能相同,但它们并不相同。也就是说,并不是所有地方都托管相同的 PHP 代码。PHP 服务代码可能会单独维护。这意味着您的代码中必须有四个客户端。4 服务参考。你做得很好。

现在,您可以使用一个客户端仅连接到它自己的服务器。所以使用欧盟客户端连接到欧盟。使用美国客户端连接到美国。这里的客户端我的意思是代理(add-service-ref 生成的东西)

消费者代码可能想要使用服务,而不管它们的位置。为此,我建议使用适配器模式。所以它会是这样的:

你的代码:

 IServiceAdapter adapter = ServiceFactory.createAdapter("EU");
 adapter.DoStuff();
 ...


   IServiceAdapter                                 AdapterFactory
   ---------------                                 --------------
   void  DoStuff1();                IServiceAdapter  CreateAdapter(string Target) {
   int   DoStuff2();                    switch Target {
                                            case "EU"
                                                return new EUServiceAdapter();
                                                break;

                                            case "US"
                                                return new USServiceAdapter();
                                                break;
                                        }
                                    }



           EU_ServiceAdpater                       
        -----------------------                   
     (Implement  IServiceAdapter)                 

     void DoStuff1() {
          ServiceReference_EU.ServiceObject1.DoStuff1();
     }

     int DoStuff2() {
          return ServiceReference_EU.ServiceObject1.DoStuff2();
     }




           US_ServiceAdpater                       
        -----------------------                   
     (Implement  IServiceAdapter)                 

     void DoStuff1() {
          ServiceReference_US.ServiceObject1.DoStuff1();
     }

     int DoStuff2() {
          return ServiceReference_US.ServiceObject1.DoStuff2();
     }

这样,您的客户端代码将不受实际端点的影响。作为一种替代方法,您可以通过服务客户端的代码配置直接重新配置端点,但我不建议这样做。它打破了欧盟家伙决定做出一些美国家伙没有做出的小改变的时刻。最好,选择适配器模式。

于 2013-08-31T07:57:42.730 回答