客户端使用自定义代理类访问WCF服务
通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或web.config文件中产生WCF服务的客户端配置信息。若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否简单在app.config或web.config文件增加WCF服务地址,然后直接通过此地址访问WCF服务呢?可以,那就是通过自定义客户端代理类来实现。本文是通过继承ClientBase<T>类实现的自定义客户端代理类,来实现同过简单在app.config或web.config文件增加wcf服务地,然后直接通过此地址访问WCF服务。
以下以一个简单的计算器WCF服务为例:
解决方案项目目录结构:
其中WCFExample.ServiceInterface项目是WCF服务接口、WCFExample.ServiceImplement项目是WCF服务实现、WCFExample.Host项目是服务宿主、WCFExample.ServiceClient项目自定义WCF服务客户端代理、WCFExample.ServiceClientTest项目是客户端测试
WCF服务接口定义
[ServiceContract]
public interface ICalculator
{
[OperationContract]
decimal Add(decimal a, decimal b);
}
WCF服务接口实现
public class Calculator : ICalculator
{
public decimal Add(decimal a, decimal b)
{
return a + b;
}
}
WCF服务客户端自定义代理类
internal class CalculatorClient : ClientBase<ICalculator>,ICalculator
{
public CalculatorClient(Binding binding, EndpointAddress remoteAddress):base(binding,remoteAddress)
{
}
public decimal Add(decimal a,decimal b)
{
return base.Channel.Add(a, b);
}
}
服务创建工厂
internal class ServiceFactory
{
public ICalculator GetCalculatorClient(string remotingAddress)
{
if(string.IsNullOrEmpty(remotingAddress))
{
return null;
}
try
{
return new CalculatorClient(this.GetInitBinding(), new EndpointAddress(remotingAddress));
}
catch
{
return null;
}
}
public ICalculator GetCalculatorClient(string remotingAddress, Binding binding)
{
if (string.IsNullOrEmpty(remotingAddress))
{
return null;
}
try
{
return new CalculatorClient(binding, new EndpointAddress(remotingAddress));
}
catch
{
return null;
}
}
private BasicHttpBinding GetInitBinding()
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.MaxBufferSize = 0x27100000;
binding.MaxReceivedMessageSize = 0x27100000L;
binding.MaxBufferPoolSize = 0x138800000L;
XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
quotas.MaxStringContentLength = 0x4e20000;
binding.ReaderQuotas = quotas;
return binding;
}
}
对外服务代理类
public class ServiceProxy
{
private ICalculator m_ICalculator;
public ServiceProxy(string remotingAddress)
{
m_ICalculator = new ServiceFactory().GetCalculatorClient(remotingAddress);
}
public ServiceProxy(string remotingAddress,Binding binding)
{
m_ICalculator = new ServiceFactory().GetCalculatorClient(remotingAddress, binding);
}
public decimal Add(decimal a,decimal b)
{
return m_ICalculator.Add(a, b);
}
}
客户端web.config增加服务地址
<appSettings>
<add key="WCFAddress" value="http://wcf.test.com/Calculator.svc%22/>
</appSettings>
客户端调用
decimal a = 10;
decimal b = 20;
string url = System.Configuration.ConfigurationManager.AppSettings["WCFAddress"];
ServiceProxy serviceProxy = new ServiceProxy(url);
Response.Write(serviceProxy.Add(a,b));
项目下载:http://files.cnblogs.com/binny1983/WCFExample.rar
客户端使用自定义代理类访问WCF服务的更多相关文章
- 客户端使用自定义代理类访问WCF服务 z
通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或 web.config文件中产生WCF服务的客户端配置信息.若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否 ...
- 关于IIS寄宿WCF服务,客户端不能生成代理类
我在使用VS2010写好WCF的Web服务后,部署在IIS7.0上,可以在IE9上进行访问,并且能显示XML数据,如下图 然后我在项目的客户端进行服务的添加引用,如下图 VS2010自动生成代理类,但 ...
- Android访问WCF服务(使用json实现参数传递)
经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法. 服务端实现 一, 实现服务. 操作契约 [ServiceContract] public interface IService { ...
- ajax调用handler,使用HttpWebRequest访问WCF服务
引言 随着手机及移动设备的普及,移动端的应用也进入了热潮.以前PC端的门户网站,大多也均推出了适配移动设备的网站或者APP,再差的也注册了个公众号.在移动应用开发中,目前据我所了解到的解决方案有:1. ...
- 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)
基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...
- Android访问WCF服务
原文链接:http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html 本章目的: 用Wcf建立可以上Android可以访问的数据服务, 数据 ...
- Wince 中访问WCF服务
由于本文并非WinCE开发普及篇,所以一些WinCE开发和WCF开发的基础还请移步百度和谷歌寻找答案,然后结合本文开发出WinCE中如何访问WCF,谢谢. 开发环境 IDE:Visual Studio ...
- Ajax跨域访问wcf服务中所遇到的问题总结。
工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...
- 三种客户端访问wcf服务端的方法 C#
原文 http://blog.csdn.net/zlj002/article/details/7914556 string jsonstr = String.Empty; string url = & ...
随机推荐
- P1959 遗址_NOI导刊2009普及(6)
题意:平面上n个点(坐标$0\le x,y\le 5000,n \le 3000$) 求以其中四个点为顶点的正方形的最大面积 $O(n^2)$枚举两个点作为当前正方形的对角线 那么如何求出另外两个点呢 ...
- php 中 ?? 和 empty 的 区别
left??right 操作符...当 left 为空时 返回 right ..注意 和 empty 相比 ,空字符,0,'0' 都会返回它本身,而不是 右边的..也就是 当且仅当 没有设置变量或者 ...
- spring 配置 junit
package cn.hefen.mall.app; import cn.hefen.mall.app.model.ResultMap; import cn.hefen.mall.app.model. ...
- Dijkstra算法图文详解
Dijkstra算法 Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不 ...
- 上传文件中文文件名乱码的解决方法以及iconv函数的使用
http://www.jb51.net/article/14530.htm 一般客户端是什么格式就展示什么格式,比如浏览器的UTF-8,windows的GBK
- Laravel5.1 目录结构解析
学习一门框架,首先要了解的就是目录结构.对目录结构清晰就可以着手学习了~这里不作新特性的介绍,权当目录结构手册看吧.若发现有何不恰当的地方请联系我哦~注:写本文时参照的是5.1.4版本 目录或文件 说 ...
- Wireshark抓包数据:理解与分析
wireshark是一个非常好用的抓包工具,本文根据平时抓包经验,对之前wireshark抓包的一些常见知识点进行了整理. 有不当之处,欢迎指正 1.SYN,FIN会消耗一个序号,单独的ACK不消耗序 ...
- Problem05 判断分数等级
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 程序分析:(a>b)?a:b这是条件运算符的基本例子. impo ...
- set与map
set /*set里面没有相同的元素 所以可以用于数组去重*/ //内部去重用的是=== 对象不等 但是 NaN等 //其本身是构造函数 let s=new Set([1,2,{},{},3,4,Na ...
- 爬虫(GET)——add_header()和get_header()
import urllib.request import random url = "http://www.baidu.com/" # 可以是User-Agent列表,也可以是代理 ...