添加wcf服务引用时,vs.net本来就会帮我们在app.config/web.config里生成各种配置,这没啥好研究的,但本文谈到的配置并不是这个。先看下面的图:

通常,如果采用.NET的WCF技术来架构SOA风格的应用,我们会把项目做一些基本的分层,如上图:

01. contract层:通常定义服务的接口(即服务契约ServiceContract,指明该服务提供了哪些方法可供外部调用)、以及接口方法中传输的Model定义(即:数据契约DataContract,指明方法中的对象参数的Class定义)

02. implementation层:即服务接口的实现

03. host层:wcf最终需要一个宿主环境,如果是web应用,最简单的办法莫过于直接寄宿在IIS上

04. client层:即服务的消费方,如果是b/s应用,通常就是一个web application

实际部署时,一般将wcf服务层和client层分开部署,如下图:

如果并发数随着业务的增长而增长,不管是client层的website,还是服务层的service,加上其它技术,比如集群或负载均衡之类,可以很方便进行扩充。服务的实现逻辑也可以方便的单独的修改替换(前提是服务契约相对稳定)

但如果应用的规模较小,出于成本考虑,完全有可能Service层和Website Client部署在一台机器上,虽然1个IIS上架2个站点完全没有问题,但是总归有点不爽,既然都在一台机器上了,为啥还要自己调用自己,增加无谓的开销呢?

最好是在不修改原来代码的前提下,通过简单的配置文件修改,就能让原来远程调用WCF的方式,改成直接调用本地DLL程序集,反过来也一样,这样就比较灵活了。事实上,我们公司很多项目就是这样处理的,规模小的应用,直接全都部署在一台机器上,等应用规模上去了,再分开部署,代码完全不用动,只要修改相关配置即可。

原理其实非常简单,反射即可,先在Client层的web.config或app.config中,增加类似以下节点:

   <appSettings>
<!--调用方式:Remote远程调用,Local本地调用(注:本地调用时,bin目录下必须有[服务实现类]的dll)-->
<add key="CallType" value="Remote"/>
<!--本地调用时,程序集的名称-->
<add key="AssemblyName" value="sjtu.wcf.demo.implementation"/>
<!--本地调用时,[服务实现类]的名称-->
<add key="ServiceTypeName" value="sjtu.wcf.demo.implementation.DemoService"/>
</appSettings>

CallType就决定了调用方式:“远程调用”或“本地DLL调用”。然后在本地写一个调用的Client类:(注:wcf的调用方式,参考了dudu的文章“享受无止境 - 改进版WCF Client”)

 using System;
using System.Linq.Expressions;
using System.Reflection;
using System.ServiceModel;
using sjtu.wcf.demo.client.configs; namespace sjtu.wcf.demo.client
{
/// <summary>
/// Wcf客户端
/// </summary>
/// <typeparam name="T">ServiceContract接口</typeparam>
public class WcfClient<T> where T : class
{ private readonly string assemblyName;
private readonly string implTypeName;
private readonly string callType; public WcfClient()
{
callType = ConfigHelper.CallType.ToLower();
if (callType == CallType.Local.ToString().ToLower())
{
assemblyName = ConfigHelper.AssemblyName;
implTypeName = ConfigHelper.ServiceTypeName;
}
} /// <summary>
/// 对外提供的Call方法
/// </summary>
/// <typeparam name="R"></typeparam>
/// <param name="expression"></param>
/// <returns></returns>
public R Call<R>(Expression<Func<T, R>> expression)
{
if (callType == CallType.Local.ToString().ToLower())
{
return InvokeLocalMethod<R>(expression);
}
return InvokeRemoteMethod<R>(expression);
} /// <summary>
/// 调用本地程序集方法
/// </summary>
/// <typeparam name="R"></typeparam>
/// <param name="operation"></param>
/// <returns></returns>
private R InvokeLocalMethod<R>(Expression<Func<T, R>> operation)
{
Assembly asm = Assembly.Load(new AssemblyName(assemblyName));
T t = (T)asm.CreateInstance(implTypeName);
R result = operation.Compile().Invoke(t);
return result;
} /// <summary>
/// 调用远程wcf方法
/// </summary>
/// <typeparam name="R"></typeparam>
/// <param name="operation"></param>
/// <returns></returns>
private R InvokeRemoteMethod<R>(Expression<Func<T, R>> operation)
{
ChannelFactory<T> channelFactory = new ChannelFactory<T>("*"); T channel = channelFactory.CreateChannel();
var client = (IClientChannel)channel;
client.Open();
R result = operation.Compile().Invoke(channel);
try
{
if (client.State != CommunicationState.Faulted)
{
client.Close();
}
}
catch
{
client.Abort();
}
return result;
}
}
}

这样调用时,只需要一行代码即可:

 var students = new WcfClient<IStudent>().Call(c => c.GetStudents("jerry"));

完整示例代码下载:http://files.cnblogs.com/yjmyzz/WcfInvoke.zip

Wcf:可配置的服务调用方式的更多相关文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_4-06 Feign核心源码解读和服务调用方式ribbon和Feign选择

    笔记 6.Feign核心源码解读和服务调用方式ribbon和Feign选择         简介: 讲解Feign核心源码解读和 服务间的调用方式ribbon.feign选择             ...

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_4-02 微服务调用方式之ribbon实战 订单调用商品服务

    笔记 2.微服务调用方式之ribbon实战 订单调用商品服务     简介:实战电商项目 订单服务 调用商品服务获取商品信息         1.创建order_service项目         2 ...

  3. 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务

    笔记 5.微服务调用方式之feign 实战 订单调用商品服务     简介:改造电商项目 订单服务 调用商品服务获取商品信息         Feign: 伪RPC客户端(本质还是用http)    ...

  4. WCF服务调用方式

    WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用.

  5. SpringCloud商品服务调用方式之feign

    简介:改造电商项目 order-service服务 调用商品服务获取商品信息 Feign: 伪RPC客户端(本质还是用http) 官方文档: https://cloud.spring.io/sprin ...

  6. SpringCloud商品服务调用方式之Ribbon

    1.创建order_service项目 pom依赖 <dependency> <groupId>org.springframework.boot</groupId> ...

  7. dubbo2.7.X版本带来的服务注册和服务调用方式改变

    参考地址:https://www.cnblogs.com/alisystemsoftware/p/13064620.html 注册中心数据结构格式改变(service:接口服务,application ...

  8. Spring cloud 两种服务调用方式(Rest + Ribbon) 和 Fegin方式

    1:Rest + Ribbon @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } @Auto ...

  9. WCF学习笔记(基于REST规则方式)

    一.WCF的定义 WCF是.NET 3.0后开始引入的新技术,意为基于windows平台的通讯服务. 首先在学习WCF之前,我们也知道他其实是加强版的一个面向服务(SOA)的框架技术. 如果熟悉Web ...

随机推荐

  1. “vmware tools 只能虚拟机中安装”的解决方法

    vmware安装的一个大坑,最近在开发上需要用到centos 6.4,由于我本身的系统是win8所以决定使用虚拟机,选择了vmware,并且从网上下载的虚拟机的映像文件.中间安装了vmware8,安装 ...

  2. Amoeba for MySQL---分布式数据库Proxy解决方案

    Amoeba是什么? Amoeba(变形虫)项目,致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy ...

  3. yii2 输出xml格式数据

    作者:白狼 出处:http://www.manks.top/yii2_xml_response.html.html本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文 ...

  4. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  5. Java并发之ThreadPoolExecutor 线程执行服务

    package com.thread.test.thread; import java.util.concurrent.ExecutorService; import java.util.concur ...

  6. Linux系统管理命令之权限管理

    对于一个目录来说,x权限:可以cd进去 对于目录: 读:看 执行:进去 写:写操作 rw权限没有意义 umask 022     特殊权限: suid sgid 2种情况:对于文件:类似于suid对于 ...

  7. 如何在Chrome39添加360抢票王插件

    前言: 版本:Chrome 39.0.2171.95 m CRX文件来源:ext.se.360.cn 本文地址:http://www.cnblogs.com/go2bed/p/4206714.html ...

  8. C# RGB和HSB相互转换

    背景 最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色.也就是说取该颜色同色系的深浅两种颜色.首先想到的是调节透明度,但效果不理想.后来尝试调节颜色亮度,发现这才是正解 ...

  9. java报表工具FineReport使用中遇到的常见报错及解决办法(三)

    这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己. 出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有.有报错要看日志.下面简单罗列下常见的问题,大多 ...

  10. 证明你是你——快速开启Windows Azure多重身份验证

    中国版Windows Azure的多重身份验证(Multi-Factor Authentication)功能已经开放.这个功能说白了就是要“证明你是你”.目前可以支持以下几种验证方式: 手机,短信验证 ...