• 学习之路十四:客户端调用WCF服务的几种方法小议


     

      最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面:

      ①WCF的地址会变动,地址虽变,但是里面的逻辑不变!

      ②不要引用WCF服务的接口DLL文件,这样会导致一定的耦合性(虽然接口一旦指定就不会改动了)! 

     1.手动配置服务(这种方式比较傻瓜)

        这种方式比较容易,也不多说了,直接给个地址就好了:学习 WCF (6)--学习调用WCF服务的各种方法     

     2.引用接口DLL,通过地址动态调用WCF服务

    复制代码
     1         private void ReleasePC(string clientName, string ttgServiceURL)
     2         {
     3             try
     4             {
     5                 object[] obj = new object[2] { clientName, clientName };
     6                 string str = (string)ExecuteMethod<IGatewayWebService>(ttgServiceURL, "ReleasePC", obj);
     7                 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None) { MaxReceivedMessageSize = 6666 };
     8                 EndpointAddress address = new EndpointAddress(ttgServiceURL);
     9                 ChannelFactory<IGatewayWebService> ttgService = new ChannelFactory<IGatewayWebService>(binding, address);
    10                 string result = ttgService.CreateChannel().ReleasePC(clientName, clientName);
    11                 GatewayReturnDef returnDef = JSONSerializer.FromJSON<GatewayReturnDef>(result);
    12                 if (returnDef.Result)
    13                     LoggingManager.WriteLog(LogLevel.Information, new LogSeparator("
    "), "Release pc success.");
    14                 else
    15                     LoggingManager.WriteLog(LogLevel.Error, new LogSeparator("
    "), "Release pc failed.");
    16             }
    17             catch (Exception exception)
    18             {
    19                 LoggingManager.WriteLog(LogLevel.Exception, new LogSeparator("
    "), "Error when invoke ReleasePC throw exception.", exception.Message, exception.InnerException);
    20             }
    21         }
    复制代码

         Note:这种方式需要引用WCF服务的提供的元数据,也就是接口DLL的引用,如果我在接口添加里面添加一个方法,那么我所引用的接口DLL也必须发生改变,这就导致了两者的耦合性升高,这种情况是不允许发生的,但也没说不允许使用,因为大部分情况下接口一旦定下来就不会变动,所以不要担心接口DLL的改动!

        Note:你也可以把这样的方法写成泛型,那么他的可扩展性就变得更好了! 

     3.通过地址获取元数据,动态生成代理类,调用WCF服务

    复制代码
     1         private void ReleasePC(string ttgServiceURL, object[] args)
     2         {
     3             try
     4             {
     5                 string serviceURL = ttgServiceURL + "/?wsdl";
     6                 DynamicProxyFactory factory = new DynamicProxyFactory(serviceURL);
     7                 DynamicProxy dynamicProxy = factory.CreateProxy("IGatewayWebService");
     8                 string result = (string)dynamicProxy.CallMethod("ReleasePC", args);
     9                 GatewayReturnDef returnDef = JSONSerializer.FromJSON<GatewayReturnDef>(result);
    10                 dynamicProxy.Close();
    11                 if (returnDef.Result)
    12                     LoggingManager.WriteLog(LogLevel.Information, new LogSeparator("
    "), "Release pc success.");
    13                 else
    14                     LoggingManager.WriteLog(LogLevel.Error, new LogSeparator("
    "), "Release pc failed.");
    15             }
    16             catch (Exception exception)
    17             {
    18                 LoggingManager.WriteLog(LogLevel.Exception, new LogSeparator("
    "), "Error when invoke ReleasePC throw exception.", exception.Message, exception.InnerException);
    19             }
    20         }
    复制代码

      Note:如果上面两种方法不能适应项目需要的话,那么这就是最后的武器了,不过它的性能有点差,因为首先要获取元数据,然后再自动生成代理类,所以性能会不好

      这种方式是通过服务地址获取WCF的元数据(wsdl),然后在再客户端动态生成代理类(第一种情况已经帮我们生成好了代理类,第二种情况有了元数据,就差代理类,第三种是既没元数据又没代理类),所以关键的地方就是获取WCF服务的元数据!

      通过前辈们提供的公用类库,我们很容易的得到WCF服务提高的元数据,下面就是生成动态生成代理类的项目文件:动态创建WCF服务代理类

      注意事项(如果采用第三种方式获取元数据,需要注意下面的问题):

      如果你是个分布式服务的话,服务端的URL地址就不能使用“localhost”地址了,因为它是一个回传地址“127.0.0.1”,所以必须把它改为局域网地址或者公网地址,这个很重要呀,一定要切忌...

      学习WCF刻不容缓啦,o(∩_∩)o 哈哈...

  • 相关阅读:
    正则表达式
    mvc3路由设置
    MVC 过滤器
    mvc3之自定义类实现路由配置和URL的生成
    Mvc View
    定义一个底层的泛型
    一个关于字典查找引发的思考——BinarySearch
    Linq学习之旅——Linq to Objects之延期执行方法(上篇)
    Linq学习之旅——Linq to Objects之立即执行方法(下篇)
    Linq学习之旅——Linq to Objects之延期执行方法(下篇)
  • 原文地址:https://www.cnblogs.com/lykbk/p/jkjkkkkkkkkkkkkkj76867867867.html
Copyright © 2020-2023  润新知