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. POJ 3373 Changing Digits 好蛋疼的DP

    一開始写的高位往低位递推,发现这样有些时候保证不了第四条要求.于是又開始写高位往低位的记忆化搜索,又发现传參什么的蛋疼的要死.然后又发现高位開始的记忆化搜索就是从低位往高位的递推呀,遂过之. dp[i ...

  2. Access to the temp directory is denied. Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss

    造成错误的原因是用bat代码清理系统垃圾时造成的权限丢失而引起的 错误描述 1.An error occurred creating the configuration section handler ...

  3. Webbrowser控件史上最强技巧全集

    原文:Webbrowser控件史上最强技巧全集 Webbrowser控件史上最强技巧全集 VB调用webbrowser技巧集 1.获得浏览器信息: Private Sub Command1_Click ...

  4. Windbg Extension NetExt

    Windbg Extension NetExt 摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR.  N ...

  5. 网站静态化处理—CSI(5)

    网站静态化处理—CSI(5) 讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说 ...

  6. VS2013中实现angular代码智能提示

    第一步:在项目同添加angular js文件的引用: 这里使用NuGet包管理器来给项目添加angular js install-package angularjs 第二步:添加智能提示js文件 我们 ...

  7. Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION

    原文:Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION Installshield获取安装包版本的系统变量为IFX_PRODUCT_VERSION 当笔记记下 ...

  8. navicat连接oracle一个错误:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK

    今天使用Navicat连接Oracle数据库.它报告了以下错误:"ORA-12737 Instant Client Light:unsupported server character se ...

  9. gtest框架

    解析gtest框架运行机制   1.前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest ...

  10. java在string和int相互转化

    1 如何串 String 转换成整数 int? A. 有两种方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([St ...