zoukankan      html  css  js  c++  java
  • 化零为整WCF(5) 宿主Hosting(宿主在IIS, Application, WAS, WindowsService)

    [索引页]
    [源码下载]


    化零为整WCF(5) - 宿主Hosting(宿主在IIS, Application, WAS, WindowsService)


    作者:webabcd


    介绍
    WCF(Windows Communication Foundation) - 宿主(Hosting):WCF服务可以宿主在IIS, Application, WAS, WindowsService。本文以宿主在WindowsService为例。


    示例
    1、服务
    IHello.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using System.ServiceModel;

    namespace WCF.ServiceLib.Sample
    {
        
    /// <summary>
        
    /// IHello接口
        
    /// </summary>

        [ServiceContract]
        
    public interface IHello
        
    {
            
    /// <summary>
            
    /// 打招呼方法
            
    /// </summary>
            
    /// <param name="name">人名</param>
            
    /// <returns></returns>

            [OperationContract]
            
    string SayHello(string name);
        }

    }


    Hello.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using System.ServiceModel;

    namespace WCF.ServiceLib.Sample
    {
        
    /// <summary>
        
    /// Hello类
        
    /// </summary>

        public class Hello : IHello
        
    {
            
    /// <summary>
            
    /// 打招呼方法
            
    /// </summary>
            
    /// <param name="name">人名</param>
            
    /// <returns></returns>

            public string SayHello(string name)
            
    {
                
    return "Hello: " + name;
            }

        }

    }



    2、宿主
    Hello.cs(WindowsService)
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using System.ComponentModel;
    using System.Configuration;
    using System.Configuration.Install;
    using System.ServiceModel;
    using System.ServiceProcess;

    namespace WCF.ServiceHostByWindowsService.Sample
    {
        
    /// <summary>
        
    /// 初始化 System.Configuration.Install.Installer 类的新实例。
        
    /// </summary>

        [RunInstaller(true)]
        
    public class ProjectInstaller : Installer
        
    {
            
    private ServiceProcessInstaller process;
            
    private ServiceInstaller service;

            
    /// <summary>
            
    /// 构造函数
            
    /// </summary>

            public ProjectInstaller()
            
    {
                process 
    = new ServiceProcessInstaller();
                process.Account 
    = ServiceAccount.LocalSystem;
                service 
    = new ServiceInstaller();
                service.ServiceName 
    = "WCF.ServiceHostByWindowsService";
                service.Description 
    = "WCF服务宿主在WindowsService[webabcd测试用]";
                
    base.Installers.Add(process);
                
    base.Installers.Add(service);
            }

        }


        
    /// <summary>
        
    /// Windows服务类
        
    /// </summary>

        public class WindowsService : ServiceBase
        
    {
            
    public ServiceHost serviceHost = null;

            
    /// <summary>
            
    /// 主函数
            
    /// </summary>

            public static void Main()
            
    {
                ServiceBase.Run(
    new WindowsService());
            }


            
    /// <summary>
            
    /// 构造函数
            
    /// </summary>

            public WindowsService()
            
    {
                
    base.ServiceName = "WCF.ServiceHostByWindowsService";
            }


            
    /// <summary>
            
    /// 启动Windows服务
            
    /// </summary>
            
    /// <param name="args">args</param>

            protected override void OnStart(string[] args)
            
    {
                
    if (serviceHost != null)
                
    {
                    serviceHost.Close();
                }


                
    // 为WCF.ServiceLib.Sample.Hello创建ServiceHost
                serviceHost = new ServiceHost(typeof(WCF.ServiceLib.Sample.Hello));

                serviceHost.Open();

                
    ServiceHost的几个事件(顾名思义)
            }


            
    /// <summary>
            
    /// 停止Windows服务
            
    /// </summary>

            protected override void OnStop()
            
    {
                
    if (serviceHost != null)
                
    {
                    serviceHost.Close();
                    serviceHost 
    = null;
                }

            }

        }

    }


    App.config
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      
    <system.serviceModel>
        
    <services>
          
    <!--name - 提供服务的类名-->
          
    <!--behaviorConfiguration - 指定相关的行为配置-->
          
    <service name="WCF.ServiceLib.Sample.Hello" behaviorConfiguration="SampleBehavior">
            
    <!--address - 服务地址-->
            
    <!--binding - 通信方式-->
            
    <!--contract - 服务契约-->
            
    <endpoint address="" binding="wsHttpBinding" contract="WCF.ServiceLib.Sample.IHello" />
            
    <!--元数据交换的endpoint-->
            
    <!--注:address是mex,它会和host/baseAddresses节点中的baseAddress做拼接,即提供元数据交换的地址为:http://localhost:12345/Binding/mex-->
            
    <endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />
            
    <host>
              
    <baseAddresses>
                
    <add baseAddress="http://localhost:11233/ServiceHostByWindowsService/"/>
              
    </baseAddresses>
            
    </host>
          
    </service>
        
    </services>
        
    <behaviors>
          
    <serviceBehaviors>
            
    <behavior name="SampleBehavior">
              
    <serviceMetadata httpGetEnabled="True"/>
              
    <serviceDebug includeExceptionDetailInFaults="False" />
            
    </behavior>
          
    </serviceBehaviors>
        
    </behaviors>
      
    </system.serviceModel>
    </configuration>


    3、客户端
    Hello.aspx
    <%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Hello.aspx.cs"
        Inherits
    ="Hosting_Hello" Title="宿主Hosting(服务宿主在WindowsService)" 
    %>

    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
        
    <div>
            
    <ul>
                
    <li style="color: Red;">本例为宿主在WindowsService的示例</li>
                
    <li>宿主在IIS请参见本解决方案的ServiceHost项目</li>
                
    <li>宿主在应用程序请参见本解决方案的ServiceHost2项目</li>
                
    <li>应用程序自宿主就是把本解决方案的ServiceLib项目和ServiceHost2项目结合在一起</li>
                
    <li>宿主在Windows Activation Services(WAS),因为我没有环境,就先不写示例了</li>
            
    </ul>
        
    </div>
        
    <asp:TextBox ID="txtName" runat="server" Text="webabcd" />
        
    &nbsp;
        
    <asp:Button ID="btnSayHello" runat="server" Text="Hello" OnClick="btnSayHello_Click" />
    </asp:Content>

    Hello.aspx.cs
    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;

    public partial class Hosting_Hello : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {

        }


        
    protected void btnSayHello_Click(object sender, EventArgs e)
        
    {
            var proxy 
    = new HostingByWindowsService.HelloClient();

            Page.ClientScript.RegisterStartupScript(
                
    this.GetType(),
                
    "js",
                
    string.Format("alert('{0}')", proxy.SayHello(txtName.Text)),
                
    true);

            proxy.Close();
        }

    }


    Web.config
    <?xml version="1.0"?>
    <configuration>
      
    <system.serviceModel>
        
    <client>
          
    <!--address - 服务地址-->
          
    <!--binding - 通信方式-->
          
    <!--contract - 服务契约-->
          
    <endpoint address="http://localhost:11233/ServiceHostByWindowsService/" binding="wsHttpBinding" contract="Sample.IHello" />
        
    </client>
      
    </system.serviceModel>
    </configuration>


    运行结果:
    启动"WCF.ServiceHostByWindowsService"服务,单击"Hello"按钮后弹出提示框,显示"Hello: webabcd"


    OK
    [源码下载]
  • 相关阅读:
    使用karma和jasmine进行angularjs单元测试
    NHibernate之(23):探索NHibernate二级缓存(上)
    NHibernate之(22):探索NHibernate一级缓存
    NHibernate之(21):探索对象状态
    NHibernate之(20):再探SchemaExport工具使用
    NHibernate之(19):初探SchemaExport工具使用
    NHibernate之(18):初探代码生成工具使用
    NHibernate之(17):探索NHibernate中使用存储过程(下)
    NHibernate之(16):探索NHibernate中使用存储过程(中)
    NHibernate之(15):探索NHibernate中使用存储过程(上)
  • 原文地址:https://www.cnblogs.com/webabcd/p/1139938.html
Copyright © 2011-2022 走看看