封装WCF客户端调用
在之前的博客中,我记录过如何利用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客户端调用的更多相关文章
- WCF初探-10:WCF客户端调用服务
创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...
- Java与WCF交互(二):WCF客户端调用Java web service【转】
原文:http://www.cnblogs.com/downmoon/archive/2010/08/25/1807982.html 在上篇< Java与WCF交互(一):Java客户端调用WC ...
- WCF系列教程之WCF客户端调用服务
1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...
- 转载——Java与WCF交互(二):WCF客户端调用Java Web Service
在上篇< Java与WCF交互(一):Java客户端调用WCF服务>中,我介绍了自己如何使用axis2生成java客户端的悲惨经历.有同学问起使用什么协议,经初步验证,发现只有wsHttp ...
- WCF客户端调用服务器端错误:"服务器已拒绝客户端凭据"。
WCF客户端和服务器端不在同一台机器上时,客户端调用服务器端会报如下错误:"服务器已拒绝客户端凭据". 解决办法:在服务端配置文件与客户端配置文件中加入下面红色部分
- WCF 客户端调用服务操作的两种方法
本节的主要内容:1.通过代理类的方式调用服务操作.2.通过通道的方式调用服务操作.3.代码下载 一.通过代理类的方式调用服务操作(两种方式添加代理类) 1.手动编写代理类,如下: 客户端契约: usi ...
- WCF客户端调用并行最大同时只支持两个请求
做项目的时候发现 频繁调用WCF服务时 明明一次性发起了几十个请求 而在服务端记录的日志却显示出现了排队的迹象 并且都是最大并发数为2 在网上狂搜 大家给出来的解决方法都是增加web.config里面 ...
- (2)WCF客户端调用
一.visual studion引用生成代理 引入服务端发布元数据的地址(并不是服务的地址) 用服务端是控制台程序 例子1 服务端的配置 <system.serviceModel> < ...
- WCF 客户端调用几种方式
http://www..com/html/blogs/20130413/2116.htm CSDN123 http://developer.51cto.com/art/200911/161465.ht ...
随机推荐
- Swift开发第四篇——柯里化
本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果 ...
- 启动app时全屏显示Default.png
一直很喜欢MJ的讲课视频,今天看了他的博客学到了些东西顺便记录下来. 在默认情况下,app显示Default.png时并非真正的"全屏显示",因为顶部的状态栏并没有被隐藏,比如下面 ...
- 关于Assets.car素材问题
最近在做自己的第一个App,由于全程都是自己一个人完成,所以原型设计.素材都得自己找,自己改.遇到了提取Assets.car中的素材的问题,通过网络找到了2中解决方法: themeEngine 使 用 ...
- IOS之Foundation之探究学习Swift实用基础整理<一>
import Foundation //加载网络数据,查找数据的字符串 let dataurl = "http://api.k780.com:88/?app=weather.city& ...
- Volley源码分析(1)----Volley 队列
Android网络框架很多,但是基于Google自己的volley,无疑是优秀的一款. 网络框架,无外乎解决一下几个问题,队列,缓存,图片异步加载,统一的网络请求和处理等. 一.Volley 队列 启 ...
- 在阿里云主机的Debian操作系统上安装Docker
因为需要新搭建饭团网站,所以需要在阿里云的主机上跑数据库,java环境. 考虑到可扩展性和模块化,所以准备最近流行的docker技术.Docker -- 从入门到实践 阿里云主机1核1G,资源不多,所 ...
- 最新Burpsuite Pro v1.7.03 介绍和破解版下载
0x00 介绍 Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程.所有的工具都共享一个能处理并显示HTTP 消息, ...
- date\"123456 错误排查
最近服务器重装,干脆将所有的源代码都重新整理了一下,开始一切正常,后来发现,每次修改一个画面的时候就会报错 跟踪了下发现是datetime.SmartDate等时间类型的数据,在进行序列化的时候改变了 ...
- python操作db2和mysql ,ibm_db
我需要提取mysql和db2的数据进行对比,所以需要用python对其都进行操作. python对mysql进行操作应该没什么问题,就是安装drive后就可以了,在上一篇中有讲安装python-mys ...
- nginx的配置总结
总体而言,nginx的配置比起apache来是要简洁很多,而言容易理解得多的,另外官网的文档也十分的简洁易懂.我们先看一个简化版的配置文件nginx.conf: #user nobody; worke ...