一、概述

  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服务作为宿主还是最为主要的手段,更加的方便快捷。

五、说明

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

最新文章

  1. CXF WebService整合SpringMVC的maven项目
  2. struts2拦截器
  3. PHP获取远程网站的服务器时间
  4. OpenWRT 路由配置技巧
  5. 【转】Android中自动连接到指定SSID的Wi-Fi
  6. PHPEXCEL导入小技巧
  7. 导航栏项目滑过时子菜单显示/隐藏jquery代码
  8. C# winform引用com组件,创建AXHOST组件失败解决方案
  9. [转] KVM VirtIO paravirtualized drivers: why they matter
  10. 15款Java程序员必备的开发工具(转)
  11. HDU1257(dp)
  12. NTCPMSG 开源高性能TCP消息发送组件
  13. MVC项目发布IIS CSS无法加载
  14. [翻译] AYVibrantButton
  15. 后台程序获取JPG/GIF/PNG图片宽度、高度
  16. 洛谷 [POI2007]BIU-Offices 解题报告
  17. llinux环境变量查看和修改
  18. Vue-cli 安装使用和理解
  19. JavaScript内存泄漏知多少?
  20. webView放弃capture()截图的替代方法

热门文章

  1. ZT C++关键字new学习
  2. STL容器及算法题:删除奇数的QQ号
  3. 【SNOI2017】炸弹
  4. UVA515 King
  5. qbxt Day1 测试犯傻祭祀
  6. 学大伟业 Day 3 培训总结
  7. 【题解】洛谷P1495 曹冲养猪 (中国剩余定理)
  8. JVM 监控以及内存分析
  9. python—迭代器
  10. 微信小程序分包加载