一、概述

  WCF程序必须在宿主上运行,也就是WCF服务必须寄宿在某一个windows的进程中,可以是IIS、控制台程序、窗体程序、WAS以及所有.net程序等程序进程中。在我用VS2013创建WCF服务的时候有四个类型:WCF服务库、WCF服务应用程序、WCF工作流服务应用程序和联合服务库。现在处于初学阶段,主要学习用到的是WCF服务库和WCF服务应用程序,它们有什么区别呢?

  1.WCF服务库:相当于一个包含WCF服务的类库,本身不能执行,必须通过别的宿主程序(如控制台程序、WAS等)托管引用后才可以使用,可以提高代码的复用性。

  2.WCF服务应用程序:相比之下可以独立运行,基于IIS托管的程序。在开发基于IIS的WCF服务时比较多见,自学的时候也多用这个,在WCF入门一[WCF概述]中就使用过。

  IIS的宿主实现在之前讲过,所以不再复述。这里我们先创建一个WCF服务库WcfServiceLibrary,将默认的文件IService1.cs和Service.cs删除,新建一个WCF服务Day.cs会生成Day,cs和IDay.cs两个文件,接口和实现如下:

namespace WcfServiceLibrary
{
[ServiceContract]
public interface IDay
{
[OperationContract]
string ShowDay(int day);
}
} namespace WcfServiceLibrary
{
public class Day : IDay
{
public string ShowDay(int day)
{
return string.Format("WCF服务返回Day是:{0}", day);
}
}
}

  这里我们在新建WCF服务Day.cs的时候VS自动给在配置文件中加上了该服务的信息,也就是终结点的信息。这里和寄宿在IIS中由IIS监听不同,如果没有添加的话需要手动添加在配置文件中或者在程序代码中写终结点的相关配置细信息Behaviors、Address等,不过正常情况下都是依赖配置文件的。

  由于控制台程序、窗体程序、windows服务和.net程序等作为宿主都是一样的,可以通过读取配置文件或者代码配置终结点等服务信息来实现。以下主要用控制台程序通过这两点实现WCF宿主。

二、代码配置终结点信息

  1.在解决方案下新建一个控制台程序ConsoleApplication。

  2.添加引用->解决方案->WcfServiceLibrary.dll。

  3.添加引用->程序集->System.ServiceModel。

  4.添加代码如下,具体请查看"MSDN ServiceHost"

namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
//创建宿主的基地址
Uri baseAddress = new Uri("http://192.168.3.30:8080/Day");
//创建宿主
using (ServiceHost host = new ServiceHost(typeof(Day), baseAddress))
{
//向宿主中添加终结点
host.AddServiceEndpoint(typeof(IDay), new WSHttpBinding(), "");
//将HttpGetEnabled属性设置为true
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
//将行为添加到Behaviors中
host.Description.Behaviors.Add(smb);
//打开宿主服务
host.Open();
Console.WriteLine("WCF中的HTTP监听已启动....");
Console.ReadLine();
host.Close();
}
}
}
}

  6.启动控制台程序,如果启动不了的话,用管理员身份运行exe,启动WCF服务。

  7.新建一个控制台解决方案,并添加地址为http://192.168.3.30:8080/Day的服务引用。之后正常调用服务如下所示:

三、读取配置文件

  1、2、3三个步骤同上,更改代码如下,这里是直接读取配置文件中的ServiceHost:

    class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Day));
//打开宿主
host.Open();
Console.Write("WCF中的HTTP监听已启动....");
Console.ReadKey();
host.Close();
}
}

  在控制台应用程序的配置文件App.Config修改如下,这里的配置项必须要对否则启动会报错。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary.Day">
<endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.IDay" />
<host>
<baseAddresses>
<add baseAddress="http://192.168.3.30:8080/Day" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

  重复同上使用WCF服务。

四、总结

  实现控制台宿主、winform宿主和windows服务宿主的代码就是以上两种方式,虽然宿主不同但是方法其实是相同的,可以根据以上的控制台宿主的实现来实现其他同类型的宿主,但是相比之下用IIS服务作为宿主还是最为主要的手段,更加的方便快捷。

五、说明

  这个随笔是我自己学习流程的一个记录,和大家共勉。

WCF入门三[WCF宿主]的更多相关文章

  1. WCF入门一[WCF概述]

    一.什么是WCF WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架.它使得开发者能够建立一个跨平台的.安全.可信赖.事务性的解决方案,且能与已有系统兼容协作 ...

  2. WCF入门教程[WCF基本应用]

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  3. WCF入门四[WCF的通信模式]

    一.概述 WCF的通信模式有三种:请求/响应模式.单向模式和双工通信. 二.请求/响应模式 请求/响应模式就是WCF的默认模式,前面几篇随笔中的示例都是这种模式,当客户端发送请求后(非异步状态下),即 ...

  4. WCF入门二[WCF的配置文件]

    一.概述 往往在很多项目中数据库连接字符串.变量和一些动态的加载类会写在配置文件中.WCF也会在配置文件中写入一些配置参数,比如服务的地址.服务用于发送和接收消息的传输和消息编码等,通过配置文件可以灵 ...

  5. 纯手写wcf代码,wcf入门,wcf基础教程

    1.定义服务协定     =>定义接口 using System.ServiceModel; namespace WcfConsole { /// <summary> /// 定义服 ...

  6. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  7. WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  8. 无废话WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  9. 【转】WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

随机推荐

  1. c++下各种编码格式转换的方法

    1.利用c++11新特性 std::wstring_convert配合std::codecvt模板类 作者:Gomo Psivarh链接:https://www.zhihu.com/question/ ...

  2. Codeforces Round #521 (Div. 3) D. Cutting Out 【二分+排序】

    任意门:http://codeforces.com/contest/1077/problem/D D. Cutting Out time limit per test 3 seconds memory ...

  3. 融云SDK:获取用户Token的方法

    融云SDK查看ServerAPI里面有个获取Token的方法,本以为只要传三个参数就可以.后来发现,在请求头有几个必须要传的参数,否则服务器返回401(未授权).拿获取Token接口为例子 如图所示, ...

  4. 【转】不错的linux下通用的java程序启动脚本

    虽然写起动shell的频率非常不高...但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell. 在网上找到一个挺好的通用shell脚本. 只需要修改一些配置变量,就可以用 ...

  5. Android学习笔记_6_保存文件到SDCard

    一.加入访问sdcard的权限 Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态 ...

  6. sql中 decode() 的用法

    sql中 decode() 的用法 SELECT ID,DECODE(inParam,'Param','value1' ,'value2') name FROM yytj2018 如果 inParam ...

  7. c语言描述的数据结构的注意细节

    :顺序表使用基址来表示和存储 int *p; p=(int *)malloc(initsize*sizeof(int)); L—>p[x]=xx; :链表 在于除了更改数据还要更改前后与之关联的 ...

  8. bzoj3895: 取石子(博弈论,记忆化搜索)

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 361  Solved: 177[Submit][Status][Discuss] D ...

  9. 【PTA 天梯赛训练】六度空间(广搜)

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...

  10. 一个BUG?Visual Studio 2017 C++编写交换两个整数

    想用一句话搞定交换: int a = 2, b = 5; cout << "a = " << a << ", b = " & ...