Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。

WCF整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTPFTP的相关技术。

简单的归结为四大部分

1>.网络服务的协议,即用什么网络协议开放客户端接入。

2>.业务服务的协议,即声明服务提供哪些业务。

3>.数据类型声明,即对客户端与服务器端通信的数据部分进行一致化。

4>.传输安全性相关的定义。

下面直接看一个例子:

一.服务端实例

1.定义一个WCF接口名称未Ichangeline

服务契约(ServiceContract),订定服务的定义。

// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IStaffLoginCheckService”。
    [ServiceContract] //服务协定定义
    public interface IChangeline
    {

[OperationContract] // 操作服务定义

string EsopCheckOk();

[OperationContract]
        string HelloWorld();

}

2.定义一个类实现接口名称Changeline

// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“StaffLoginCheckService”。
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
    public class Changeline : IChangeline
    {
       public string HelloWorld()
        {
            string result = "123456";
            return result;
        }

}

3.开通WCF所需要的服务,也可以从VS直接添加WCF服务

  #region 启动WCF服务
private void OpenWcfService()
{
try
{
var changeline = new Changeline(bendview);
host = new ServiceHost(changeline, new Uri("http://localhost:8734/MyService/"));
//这是我们服务的地址
host.AddServiceEndpoint(typeof(IChangeline), new BasicHttpBinding(), string.Empty);
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
//mex元数据的地址
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
host.Open();
var port = ""; //获取端口号
var inname = "Changeline"; //打开端口号的名称
var str = " netsh advfirewall firewall add rule name=" + inname +
" dir=in action=allow protocol=TCP localport= " + port;
var pro = new Process(); //实例化进程
pro.StartInfo.FileName = "cmd.exe"; //设置要运行的程序文件
pro.StartInfo.UseShellExecute = false; //是否使用操作系统shell程序启动
pro.StartInfo.RedirectStandardInput = true; //是否接受来自应用程序的调用
pro.StartInfo.RedirectStandardOutput = true; //是否接受来自应用程序的输出信息
pro.StartInfo.RedirectStandardError = true; //是否接受重定向错误信息
pro.StartInfo.CreateNoWindow = true; //不显示窗口信息
pro.Start(); //启动程序 //向cmd窗口发送输入信息
pro.StandardInput.WriteLine(str + "&exit"); pro.StandardInput.AutoFlush = true;
pro.WaitForExit(); //等待程序运行完退出程序
pro.Close(); //关闭进程
}
catch (Exception ex)
{
Tool.Log.Error("WCF开起失败:" + ex.Message);
}
CheckWCFServerTh = new Thread(WCF_HostCheck);
CheckWCFServerTh.IsBackground = true;
CheckWCFServerTh.Start();
}
void WCF_HostCheck(object o)
{
//Closed 指示通信对象已关闭,且不再可用。
//Closing 指示通信对象正转换到 Closed 状态。
//Created 指示通信对象已实例化且可配置,但尚未打开或无法使用。
//Faulted 指示通信对象发生错误,无法恢复且不再可用。
//Opened 指示通信对象目前已打开,且随时可供使用。
//Opening 指示通信对象正从 Created 状态转换到 Opened 状态。
while (true)
{
try
{
if (!(host.State == CommunicationState.Opened || host.State == CommunicationState.Opening))
{
var changeline = new Changeline(bendview);
host = new ServiceHost(changeline, new Uri("http://localhost:8734/MyService/"));
//这是我们服务的地址
host.AddServiceEndpoint(typeof(IChangeline), new BasicHttpBinding(), string.Empty);
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
//mex元数据的地址
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
host.Open(); var port = ""; //获取端口号
var inname = "Changeline"; //打开端口号的名称
var str = " netsh advfirewall firewall add rule name=" + inname +
" dir=in action=allow protocol=TCP localport= " + port;
var pro = new Process(); //实例化进程
pro.StartInfo.FileName = "cmd.exe"; //设置要运行的程序文件
pro.StartInfo.UseShellExecute = false; //是否使用操作系统shell程序启动
pro.StartInfo.RedirectStandardInput = true; //是否接受来自应用程序的调用
pro.StartInfo.RedirectStandardOutput = true; //是否接受来自应用程序的输出信息
pro.StartInfo.RedirectStandardError = true; //是否接受重定向错误信息
pro.StartInfo.CreateNoWindow = true; //不显示窗口信息
pro.Start(); //启动程序
//向cmd窗口发送输入信息
pro.StandardInput.WriteLine(str + "&exit");
pro.StandardInput.AutoFlush = true;
pro.WaitForExit(); //等待程序运行完退出程序
pro.Close(); //关闭进程
}
}
catch (Exception ex)
{
Tool.Log.Error("WCF开起失败:" + ex.Message);
}
Thread.Sleep();
}
}
#endregion

二.客户端的程序

1.配置好通道工厂,为客户端创立独立通道,为获取接口配置程序可以创建一个类(WcfChannelFactory)

 /// <summary>
/// 使用ChannelFactory为wcf客户端创建独立通道
/// </summary>
public class WcfChannelFactory
{
public WcfChannelFactory()
{
} /// <summary>
/// 执行方法 WSHttpBinding
/// </summary>
/// <typeparam name="T">服务接口</typeparam>
/// <param name="uri">wcf地址</param>
/// <param name="methodName">方法名</param>
/// <param name="args">参数列表</param>
public static object ExecuteMetod<T>(string uri, string methodName, params object[] args)
{
//BasicHttpBinding binding = new BasicHttpBinding();
WSHttpBinding binding = new WSHttpBinding();
EndpointAddress endpoint = new EndpointAddress(uri); using (ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint))
{
T instance = channelFactory.CreateChannel();
using (instance as IDisposable)
{
try
{
Type type = typeof(T);
MethodInfo mi = type.GetMethod(methodName);
return mi.Invoke(instance, args);
}
catch (TimeoutException)
{
(instance as ICommunicationObject).Abort();
throw;
}
catch (CommunicationException)
{
(instance as ICommunicationObject).Abort();
throw;
}
catch (Exception vErr)
{
(instance as ICommunicationObject).Abort();
throw;
}
}
}
} //nettcpbinding 绑定方式
public static object ExecuteMethod<T>(string pUrl, string pMethodName,params object[] pParams)
{
EndpointAddress address = new EndpointAddress(pUrl);
Binding bindinginstance = null;
BasicHttpBinding ws = new BasicHttpBinding();
ws.MaxReceivedMessageSize = ;
bindinginstance = ws;
using (ChannelFactory<T> channel = new ChannelFactory<T>(bindinginstance, address))
{
T instance = channel.CreateChannel();
using (instance as IDisposable)
{
try
{
Type type = typeof(T);
MethodInfo mi = type.GetMethod(pMethodName);
return mi.Invoke(instance, pParams);
}
catch (TimeoutException)
{
(instance as ICommunicationObject).Abort();
throw;
}
catch (CommunicationException)
{
(instance as ICommunicationObject).Abort();
throw;
}
catch (Exception vErr)
{
(instance as ICommunicationObject).Abort();
throw;
}
}
}
}
}

2.调用WcfChannelFactory,获取接口数据

调用时需要把服务端开的接口添加到本程序中,

 public void Statedeal()
{
try
{ string result = WcfChannelFactory.ExecuteMethod<IChangeline>("http://localhost:8734/MyService/", "EsopCheckOk").ToString(); MessageBox.Show(result.ToString());
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString()); }
}

此时整个的服务端与客户端都可以实现了,如果客户端程序中也含有wcf服务程序(也会发布WCF服务,也作为服务端),并且接口名称与服务端(本客户端的服务端)的接口名称相同,那就必须保证服务端提供的接口名称与客户端定义的接口名称不同,或者相同名称在不同的程序集下。

WCF接口实例介绍的更多相关文章

  1. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  2. 【转】Web Service单元测试工具实例介绍之SoapUI

    转自:http://blog.csdn.net/oracle_microsoft/article/details/5689585 SoapUI 是当前比较简单实用的开源Web Service 测试工具 ...

  3. osg实例介绍

    osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...

  4. tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍

    tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...

  5. Web Service单元测试工具实例介绍之SoapUI

    原文  Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组 ...

  6. WCF小实例以及三种宿主

    WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...

  7. 转载:kafka c接口librdkafka介绍之二:生产者接口

    转载:from:http://www.verydemo.com/demo_c92_i210679.html 这个程序虽然我调试过,也分析过,但是没有记录笔记,发现下边这篇文章分析直接透彻,拿来借用,聊 ...

  8. Spring IOC(通过实例介绍,属性与构造方法注入)

    概括说明:下面通过实例介绍下属性方法注入.构造方法注入 1.源码结构图 2.代码介绍 (1).Dao接口 :UserDAO (2).Dao接口实现:UserDAOImpl (3).实体类:User ( ...

  9. 引擎基本服务接口API介绍

    Slickflow.NET 开源工作流引擎基础介绍(一) -- 引擎基本服务接口API介绍 https://www.cnblogs.com/slickflow/p/4807227.html 工作流术语 ...

随机推荐

  1. GUI的最终选择Tkinter模块初级篇

    一.Tkinter模块的基本使用 1)实例化窗口程序 import tkinter as tk app = tk.Tk() app.title("FishC Demo") app. ...

  2. python学习 day11 (3月16日)----(生成器内置函数)

    1生成器 1生成器的本质 一定是迭代器(反之不一定(用send(生成器特有方法)验证))2生成器是可以让程序员自己定义的一个迭代器3生成器的好处,节省内存空间4生成器的特性,一次性的,惰性机制,从上往 ...

  3. kbmmw 5.0 beta1 发布

    经过大半年的等待,kbmmw 的新版终于来了.经过近5年的打磨, kbmmw 的版本号升级到5了. kbmMW is a portable, highly scalable, high end app ...

  4. 746. Min Cost Climbing Stairs

    两种方法,核心思想都一样,求出走到每一步上的最小开销,直到最后一步和倒数第二步,比较其最小值返回即可. 方法一,用一个辅助的容器 class Solution { public: int minCos ...

  5. idea中使用thymeleaf标签时有红色的波浪线怎么去掉

    使用最新版本的idea2017可以解决,方法如下: 选择File->Settings->Editor->Inspections,然后搜索thymeleaf 将Expression v ...

  6. 02 Django配置信息

    2-1 基本配置信息 import os # 项目路径 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # ...

  7. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  8. UVa 11762 Race to 1 (数学期望 + 记忆化搜索)

    题意:给定一个整数 n ,然后你要把它变成 1,变换操作就是随机从小于等于 n 的素数中选一个p,如果这个数是 n 的约数,那么就可以变成 n/p,否则还是本身,问你把它变成 1 的数学期望是多少. ...

  9. 容器,表格 ,div,元素可左右拖动,滚动 css

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. js实现锚点定位

    js实现锚点定位的原理是,算出定位的标签距离顶部的高度,点击触发标签,重新赋值滚动条的高度到达指定位置. <!DOCTYPE html> <html> <head> ...