WCF采用基于契约的服务调用方法,通过System.ServiceModel.ChannelFactory<TChannel>直接创建服务代理对象。

创建服务代理

 public static T Create<T>(string endpointName)
{
if (string.IsNullOrEmpty(endpointName))
{
#region 默认配置,根据类名,赋值endpointName
#endregion
throw new ArgumentNullException("endpointName");
}
return (T)(new ServiceRealProxy<T>(endpointName).GetTransparentProxy());
}
  public class ServiceRealProxy<T> : RealProxy
{
private readonly string _endpointName; public ServiceRealProxy(string endpointName)
: base(typeof(T))
{
if (string.IsNullOrEmpty(endpointName))
{
throw new ArgumentNullException("endpointName");
}
_endpointName = endpointName;
} public override IMessage Invoke(IMessage msg)
{
T channel = ChannelFactoryCreator.Create<T>(this._endpointName).CreateChannel();
var methodCall = (IMethodCallMessage)msg;
IMethodReturnMessage methodReturn = null;
object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[];
methodCall.Args.CopyTo(copiedArgs, );
try
{
object returnValue = methodCall.MethodBase.Invoke(channel, copiedArgs);
methodReturn = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall);
var communicationObject = channel as ICommunicationObject;
if (communicationObject != null) communicationObject.Close();
}
catch (Exception ex)
{
if (ex.InnerException is CommunicationException || ex.InnerException is TimeoutException)
{
var communicationObject = channel as ICommunicationObject;
if (communicationObject != null) communicationObject.Abort();
} methodReturn = ex.InnerException != null ? new ReturnMessage(ex.InnerException, methodCall) : new ReturnMessage(ex, methodCall);
} return methodReturn;
}
}

WCF如何通过契约加编码方式调用的更多相关文章

  1. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  2. Post方式调用wcf服务

    我们平常在PC端调用WCF服务,只要知道WCF服务的地址,客户端直接添加引用服务就可以使用了,殊不知还有其他方式,其实,我们也可以 通过HTTP POST的方式调用WCF服务,这样就不用添加引用了,在 ...

  3. 以WCF安全认证方式调用通用权限管理系统获取基础信息资料

    在B/S开发中,涉及到获取系统基础资料的问题,因为是在不同平台下的开发,采用了WCF方式获取. 下面是一个调用通用权限管理系统(吉日嘎拉)基础信息资料的一个demo供参考 调用原理图: web.con ...

  4. (转)将wcf 以webservice的方式调用

    将wcf 以webservice的方式调用 问题:a公司使用wcf 发布服务(.net Framework 3.0 or 3.5),b公司需要使用a公司发布的服务 ,但b公司目前阶段只使用.net F ...

  5. WCF配置后支持通过URL进行http方式调用

    最近遇到一个小型项目,主要就是通过手机写入NFC信息,思考许久后决定就写一个简单的CS程序来搞定这个问题,可是当涉及到手机和PC通信的时候首先考虑到的就是IIS,同时因为数据库是SQLite,思前想后 ...

  6. 知道WCF的地址用工厂通道方式快速调用WCF

    知道WCF的地址用工厂通道方式快速调用WCF  1 using System;  2 using System.ServiceModel;  3 using System.ServiceModel.D ...

  7. 为什么一定要调用 setlocale 呢? 因为在 C/C++ 语言标准中定义了其运行时的字符集环境为 "C" ,也就是 ASCII 字符集的一个子集。使用setlocal改变整个应用程序的字符集编码方式(wcstombs使用前要设置 setlocale (LC_ALL, "chs"); )

    setlocale 配置地域化信息. 语法: string setlocale(string category, string locale); 返回值: 字符串 函数种类: 操作系统与环境   内容 ...

  8. Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示

    如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0.6.0 ...

  9. AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)

    使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...

随机推荐

  1. Win7_64位使用Mysql Odbc

    1.首先不能安装Mysql Odbc 64位,因为我们的Mysql是32位,使用Mysql Odbc 64位连接Mysql 32位,报错:驱动程序与应用程序之间的体系结构不匹配. 2.要安装Mysql ...

  2. Service 与 Thread 的区别

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  3. [js] 函数节流

    原文链接:http://www.alloyteam.com/2012/11/javascript-throttle/

  4. ref、out

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ref_ ...

  5. OpenGL的glTexCoord2f纹理坐标配置

    纹理坐标配置函数,先看定义: void glTexCoord2f (GLfloat s, GLfloat t); 1.glTexCoord2f()函数 有两个参数:GLfloat s, GLfloat ...

  6. Linux命令(1) - 查看内存使用情况: free -hm

    使用"free -hm"命令查看linux服务器的内存使用状况,其中-h表示人性化显示,-m表示将内存显示为M:

  7. perl中->和=>作用

    -> 用法 -> 有两种用法,都和解引用有关. 第一种用法,就是解引用. 根据 -> 后面跟的符号的不同,解不同类型的引用, ->[] 表示解数组引用,->{} 表示解散 ...

  8. ServletInputStream的重复读取(多次读取)(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  9. 【BZOJ 2243】染色 - 树链剖分+线段树

    #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; const ...

  10. 20145218 《Java程序设计》第04次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:Android开发基础 一.实验内容 1.基于Android ...