WCF小实例以及三种宿主

最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾;本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Windows服务宿主)的练习;还包含一个双工的功能,下图为程序所创建分层结构图;

首先了解为这个实例所创建的两张简单表;

USE [TestDb]
GO
/****** 对象: Table [dbo].[T_Account] 脚本日期: 07/31/2013 23:09:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_Account](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Uid] [int] NULL,
[Money] [int] NULL,
CONSTRAINT [PK_T_Account] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] GO
USE [TestDb]
GO
/****** 对象: Table [dbo].[T_User] 脚本日期: 07/31/2013 23:10:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_User](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[PassWord] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

接下来简单了解每一层的作用以及一些注意事项;源代码后面直接提供下载;

1:Service.DAL 是针对数据库操作的一些类;

2:Service.DbHelp 为数据库操作提供助手

3:Service.HostTest 为服务提供自宿主的测试;一般在编码时会用到;此层还用到批量寄存的知识;

4:Service.Interface 为契约层,定义的相关开放接口;

5:Service.Model为实体层也是数据契约层;

6:Service.ServerDemo 为实现契约的服务内容;若有逻辑都放在这一层;

7:WcfServiceForIIs 为宿主在IIS内容;

8:WebClient 为客户端为Web形式

9:Windows_HostService为宿主要Windows服务里的内容;

10:WindowsClient、WindowsFormsForHostService、WindowsFormsForIIS分别是对三种寄存宿主进行测试的客户端;

一:注意点批量寄存宿主;把重点的一些配置一及实现代码贴出;

<configuration>
<configSections>
<section name="artech.batchingHosting"
type="Service.HostTest.Configuration.BatchingHostingSettings, Service.HostTest"/>
</configSections>
<appSettings>
<add key="ConnectionString" value="server=.;database=TestDb;uid=sa;pwd=admin"/>
</appSettings>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="portSharingBinding" portSharingEnabled="true"></binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="UsermetadataBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:3721/UserService/metadata"/>
</behavior>
<behavior name="AccountmetadataBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:3721/AccountService/metadata"/>
</behavior>
<behavior name="ExcptDivedeBehavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Service.ServerDeom.UserService" behaviorConfiguration="UsermetadataBehavior">
<endpoint address="http://127.0.0.1:3721/UserService"
binding="wsHttpBinding"
contract="Service.Interface.IUser"/>
</service>
<service name="Service.ServerDeom.AccountService" behaviorConfiguration="AccountmetadataBehavior">
<endpoint address="http://127.0.0.1:3721/AccountService"
binding="wsHttpBinding"
contract="Service.Interface.IAccount"/>
</service>
<service name="Service.ServerDeom.DuplexTestService">
<endpoint address="net.tcp://127.0.0.1:3722/DuplexTestService"
binding="netTcpBinding"
contract="Service.Interface.IDuplexTest" bindingConfiguration="portSharingBinding"/>
</service>
<service name="Service.ServerDeom.ExcptDivideService" behaviorConfiguration="ExcptDivedeBehavior">
<endpoint address="http://127.0.0.1:3723/ExcptDivideService"
binding="wsHttpBinding"
contract="Service.Interface.IExcptDivide"/>
</service>
</services>
</system.serviceModel>
<artech.batchingHosting>
<add type="Service.ServerDeom.UserService, Service.ServerDeom"/>
<add type="Service.ServerDeom.AccountService, Service.ServerDeom"/>
<add type="Service.ServerDeom.DuplexTestService, Service.ServerDeom"/>
<add type="Service.ServerDeom.ExcptDivideService, Service.ServerDeom"/>
</artech.batchingHosting>
</configuration>
using System.ServiceModel;
using Service.ServerDeom;
using Service.Interface;
namespace Service.HostTest
{
class Program
{
static void Main(string[] args)
{
using (ServiceHostCollection hosts = new ServiceHostCollection())
{
foreach (ServiceHost host in hosts)
{
host.Opened += (sender, arg) => Console.WriteLine("服务{0}开始监听", (sender as ServiceHost).Description.ServiceType);
}
hosts.Open();
Console.Read();
}
}
}
}

二:宿主要IIS里的注意内容;

新建一个文本文件然后把它的后缀修改成.svc;并在其头部增加一行调用服务的代码;

<%@ ServiceHost Language="C#" Debug="true" Service="Service.ServerDeom.UserService" %>

其配置如下:

<configuration>
<appSettings>
<add key="ConnectionString" value="server=.;database=TestDb;uid=sa;pwd=admin"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors> <services>
<service name="Service.ServerDeom.UserService">
<endpoint binding="ws2007HttpBinding"
contract="Service.Interface.IUser"/>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer> </configuration>

把I宿主部署到IIS里;

三:宿主在Windows服务;创建一个Windows服务类库,增加相应的配置以及代码;

<configuration>
<appSettings>
<add key="ConnectionString" value="server=.;database=TestDb;uid=sa;pwd=admin"/>
</appSettings>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="portSharingBinding" portSharingEnabled="true"></binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="UsermetadataBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:3718/UserService/metadata"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="Service.ServerDeom.UserService" behaviorConfiguration="UsermetadataBehavior">
<endpoint address="http://127.0.0.1:3718/UserService"
binding="wsHttpBinding"
contract="Service.Interface.IUser"/>
</service>
</services>
</system.serviceModel>
</configuration>
using System.ServiceModel;
using Service.ServerDeom;
using Service.Interface;
namespace Windows_HostService
{
public partial class Service1 : ServiceBase
{
private ServiceHost serviceHost = null; //寄宿服务对象
public Service1()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
try
{
serviceHost = new ServiceHost(typeof(UserService));
if (serviceHost.State != CommunicationState.Opened)
{
serviceHost.Open();
}
}
catch (Exception ex)
{
}
} protected override void OnStop()
{
}
}
}

然后安装服务文件的一些属性进行设置,比如服务自动重启,服务名称等;另一些图是对服务进行安装;

若服务安装成功后会在服务里可以看到如下:

客户端调用服务的代码大家就直接看源代码,由于本人也是刚开始学习WCF,实例内容为本人学习所做,若有不足或错误欢迎指正;[源代码下载]

 
 
 
标签: WCF

WCF小实例以及三种宿主的更多相关文章

  1. 获得 LayoutInflater 实例的三种方式

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  2. [转]获得 LayoutInflater 实例的三种方式

    转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式   在实际开 ...

  3. Java Class类以及获取Class实例的三种方式

    T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>.   publi ...

  4. Unity3d UGUI 界面适配 实例解析 三种适配方式

    之前做游戏都是用公司自己的引擎,对于界面的适配分Android和IOS两种系统处理. 对于IOS设备,由于数量有限,只要做到 960x640  1024x769 1136x640 (当时还没有ipho ...

  5. 【转】delphi程序只允许运行一个实例的三种方法:

    一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' ...

  6. StringBuffer 清空StringBuffer的实例的三种方法

    @Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...

  7. C#创建泛型类T的实例的三种方法

    原文链接:https://www.cnblogs.com/lxhbky/p/6020612.html 方法一,通过外部方法传入的实例来实例化: //泛型类: public class MySQLHel ...

  8. WCF(二)三种通信模式

    WCF在通信过程中有三种模式:请求与答复.单向.双工通信 请求与答复模式 客户端发送请求,然后一直等待服务端的响应答复(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序 请求 ...

  9. (二)微信小程序的三种传值方式

    1.全局变量 app.js里 App({ //全局变量 globalData: { userInfo: null, host: 'http://localhost:8080/data.json' } ...

随机推荐

  1. Shuttle ESB

    Shuttle ESB(六)——在项目中的应用 如果说你认真看了前面几篇关于ESB的介绍,我相信,在这一篇文章中,你将会找到很多共鸣. 尽管,市面上开源的ESB确实非常之多,像Java中的Mule E ...

  2. Asp.Net MVC5入门学习系列②

    原文:Asp.Net MVC5入门学习系列② 添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用 ...

  3. Asp.net vNext 学习3

    Asp.net vNext 学习之路(三) asp.net vNext 对于构建asp.net 程序带来了一些重大的改变,让我们开发asp.net 程序的时候更加的方便和高效. 1,可以很容易的去管理 ...

  4. 使用SQL Server Driver for PHP解决PHP连接MSSQL乱码的问题

    原文 使用SQL Server Driver for PHP解决PHP连接MSSQL乱码的问题 最近帮客户写了一个.net商城网站的发布接口,大家都知道.net一般都使用MSSQL数据库,但鱼丸不会. ...

  5. 一张地图,告诉你NodeJS命令行调试器语句

    NodeJS提供脚本调试. 进入node debug xx.js您可以进入调试模式. 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  6. 【 D3.js 进阶系列 — 5.0 】 直方图

    直方图用于描写叙述概率分布,D3 提供了直方图的布局 Histogram 用于转换数据. 假设有数组 a = [10, 11, 11.5, 12.5, 13, 15, 19, 20 ],如今把10~2 ...

  7. jQuery无限级联下拉框插件

    自己编写jQuery插件 之 无限级联下拉框   因为是级联,所以数据必须是树型结构的,我这里的测试数据如下: 看下效果图: 1.>图一: 2.>图二: 3.>图三: 由图可知,下拉 ...

  8. Nhibernate分页测试续

    Nhibernate分页测试续(附源码) 接着上一篇Nhibernate分页测试,最近一直在接触Nhibernate,接触的越多.了解越深,越是感觉他的强大,很多功能都封装的很好,对数据操作是那么的简 ...

  9. asp.net请求响应模型原理随记回顾

    asp.net请求响应模型原理随记回顾: 根据一崇敬的讲师总结:(会存在些错误,大家可以做参考) 1.-当在浏览器输入url后,客户端会将请求根据http协议封装成为http请求报文.并通过主sock ...

  10. extjs 时间可选择时分

    new Ext.form.DateTimeField({ id: 'SdDateField', width: 130, format: 'Y-m-d H:i', editable: false, va ...