zoukankan      html  css  js  c++  java
  • WCF小实例以及三种宿主

    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
  • 相关阅读:
    CSS中的外边距合并问题
    Web性能优化的途径
    HTML5读书笔记——canvas元素(续)
    HTML5读书笔记——canvas元素
    2016/9/8日志
    【每日一醒】【架构师之路】设计文档之惑
    华为是个好公司,但不全是好员工——记初次压力面试的体验
    忐忑的一天,心里还是小兴奋的
    atexit()函数
    年终心结,心绪的总结!
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3229339.html
Copyright © 2011-2022 走看看