在之前的博客中,我记录过如何利用SvcUtil.exe工具生成客户端的代理文件,然后调用的情形。

今天我要讲解的是利用代码直接对服务端进行调用。好处在于,一是不会生成那么大的引用文件,其次是可以方便控制。首先感谢本文:分享基于EF+WCF的通用三层架构及解析提供的源代码。

首先服务器端的我就不用写了,这里我贴出OperationContract的内容:

   1:  public Book GetBook(int bookID)
   2:   {
   3:        return new Book
   4:        {
   5:                  BookID = 1,
   6:                  BookAuthor = "石朝阳",
   7:                  BookName = "企业架构模式",
   8:                  BookPrice = 85.2M,
   9:                  BookPublishment = "清华大学出版社"
  10:        };
  11:   }

服务器端的代码没什么特别的。

下面是客户端的调用代码:

首先,声明一个IServiceFactory接口,这个接口中有CreateService方法:

   1:     public interface IServiceFactory
   2:      {
   3:          IBookService CreateService();
   4:      }

然后声明一个RemoteServiceFactory类,这个类中提供创建客户端引用的实例:

   1:  public class RemoteServiceFactory:IServiceFactory
   2:      {
   3:          private readonly string serviceUri = "http://localhost:12665/BookService.svc";
   4:   
   5:          public IBookService CreateService()
   6:          {
   7:              return this.CreateService<IBookService>(serviceUri);
   8:          }
   9:   
  10:          private const int maxReceivedMessageSize = 2147483647;
  11:   
  12:          private T CreateService<T>(string uri)
  13:          {
  14:              var key = string.Format("{0} - {1}",typeof(T),uri);
  15:              var binding = new BasicHttpBinding();
  16:              binding.MaxReceivedMessageSize = maxReceivedMessageSize;
  17:              binding.ReaderQuotas = new XmlDictionaryReaderQuotas();
  18:              binding.ReaderQuotas.MaxStringContentLength = maxReceivedMessageSize;
  19:              binding.ReaderQuotas.MaxArrayLength = maxReceivedMessageSize;
  20:              binding.ReaderQuotas.MaxBytesPerRead = maxReceivedMessageSize;
  21:   
  22:              ChannelFactory<T> chan = new ChannelFactory<T>(binding,new EndpointAddress(uri));
  23:              foreach (var operation in chan.Endpoint.Contract.Operations)
  24:              {
  25:                  var dataContractBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>() 
  26:                      as DataContractSerializerOperationBehavior;
  27:                  if (dataContractBehavior != null)
  28:                      dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
  29:              }
  30:              chan.Open();
  31:   
  32:              var service = chan.CreateChannel();
  33:              return service;
  34:          }
  35:      }

最后在程序中调用即可:

   1:   
   2:          static void Main(string[] args)
   3:          {
   4:              Program program = new Program();
   5:              Book book = program.Service.GetBook(2);
   6:              Console.WriteLine("Book ID:"+book.BookID.ToString());
   7:              Console.WriteLine("Book Name:" + book.BookName.ToString());
   8:              Console.WriteLine("Book Author:" + book.BookAuthor.ToString());
   9:              Console.WriteLine("Book Publishment:" + book.BookPublishment.ToString());
  10:              Console.WriteLine("Book Price:" + book.BookPrice.ToString());
  11:   
  12:              Console.ReadKey();
  13:          }
  14:   
  15:          public IServiceFactory ServiceFactory
  16:          {
  17:              get
  18:              {
  19:                  //Need to inject dynamic later
  20:                  return new RemoteServiceFactory();
  21:              }
  22:          }
  23:   
  24:          public IBookService Service
  25:          {
  26:              get
  27:              {
  28:                  return this.ServiceFactory.CreateService();
  29:              }
  30:          }

得到的结果如下:

封装WCF客户端调用的更多相关文章

  1. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  2. Java与WCF交互(二):WCF客户端调用Java web service【转】

    原文:http://www.cnblogs.com/downmoon/archive/2010/08/25/1807982.html 在上篇< Java与WCF交互(一):Java客户端调用WC ...

  3. WCF系列教程之WCF客户端调用服务

    1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...

  4. 转载——Java与WCF交互(二):WCF客户端调用Java Web Service

    在上篇< Java与WCF交互(一):Java客户端调用WCF服务>中,我介绍了自己如何使用axis2生成java客户端的悲惨经历.有同学问起使用什么协议,经初步验证,发现只有wsHttp ...

  5. WCF客户端调用服务器端错误:"服务器已拒绝客户端凭据"。

    WCF客户端和服务器端不在同一台机器上时,客户端调用服务器端会报如下错误:"服务器已拒绝客户端凭据". 解决办法:在服务端配置文件与客户端配置文件中加入下面红色部分

  6. WCF 客户端调用服务操作的两种方法

    本节的主要内容:1.通过代理类的方式调用服务操作.2.通过通道的方式调用服务操作.3.代码下载 一.通过代理类的方式调用服务操作(两种方式添加代理类) 1.手动编写代理类,如下: 客户端契约: usi ...

  7. WCF客户端调用并行最大同时只支持两个请求

    做项目的时候发现 频繁调用WCF服务时 明明一次性发起了几十个请求 而在服务端记录的日志却显示出现了排队的迹象 并且都是最大并发数为2 在网上狂搜 大家给出来的解决方法都是增加web.config里面 ...

  8. (2)WCF客户端调用

    一.visual studion引用生成代理 引入服务端发布元数据的地址(并不是服务的地址) 用服务端是控制台程序 例子1 服务端的配置 <system.serviceModel> < ...

  9. WCF 客户端调用几种方式

    http://www..com/html/blogs/20130413/2116.htm CSDN123 http://developer.51cto.com/art/200911/161465.ht ...

随机推荐

  1. iOS开发~UI布局(三)深入理解autolayout

    一.概要 通过对iOS8界面布局的学习和总结,发现autolayout才是主角,autolayout是iOS6引入的新特性,当时还粗浅的学习了下,可是没有真正应用到项目中.随着iOS设备尺寸逐渐碎片化 ...

  2. 《极客学院 --NSAttributedString 使用详解-4-UITextKit 简介》学习笔记(待处理)

    如果要在富文本中添加图片的话,用UITextKit才能实现. 什么是UITextKit:它就是处理富文本的框架. 什么时候使用UITextKit:比如要实现图文混搭的节目. 在gitHub中 http ...

  3. iOS本地数据存储(转载)

    看到一篇不错的文章,推荐给大家!!! 应用沙盒 1)每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 2)应用沙盒的文 ...

  4. 比较全面的MySQL优化参考(上下篇)

    转自:http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml 本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨 ...

  5. 升级了win10后开启wifi热点出现iphone&macbook连接断线的问题(win7也一样)

    升级了win10后开启wifi热点出现iphone&macbook连接 不间断 断线的问题 文后附上开启虚拟wifi的办法 百度参考了别人也出现这种问题,解决办法是修改信道,默认信道是11,修 ...

  6. Legends-ggplot2图例的一些操作

    移除图例 require(ggplot2) b = qplot(Sepal.Length,Petal.Length,data=iris,geom="point",colour = ...

  7. WinForm窗体间如何传值

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...

  8. MSBI--enlarge the DW database table volume

    我们在学习MSBI的时候,经常会使用官方提供的Adventureworks和AdventureworksDW示例数据库,但是官方提供的数据量有点小, 以DW为例,Factinternetsales只有 ...

  9. perl学习笔记

    一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...

  10. dipole antenna simulation by CST

    CST偶极子天线仿真,半波振子天线 一.本文使用CST仿真频率为1GHz的偶极子天线,使用2013版本.仿真的步骤为 1.选择一个CST的天线工程模板 2.设置好默认的单位 3.设置背景的材料(空气腔 ...