zoukankan      html  css  js  c++  java
  • WCF 承载服务

    WCF 承载服务

    WinForm 承载 WCF
    服务端
    服务代码

    服务接口:

    namespace WCFService

    {

    [ServiceContract]

    public interface IServiceWindow

    {

    [OperationContract(IsOneWay=false)]

    string GetCurrentTime();

    }

    }

    服务实现:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.ServiceModel;

    using System.Text;

    namespace WCFService

    {

    public class ServiceWindow:IServiceWindow

    {

    #region IServiceWindow 成员

    public string GetCurrentTime()

    {

    return string.Format("Window Server Time:{0}", DateTime.Now.ToString());

    }

    #endregion

    }

    }

    配置

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

    <system.serviceModel>

    <services>

    clip_image001

    clip_image002 <service behaviorConfiguration="WCFService.ServiceWindowBehavior"

    name="WCFService.ServiceWindow">

    <host>

    <baseAddresses>

    <add baseAddress="http://localhost:8000/ServiceWindow/"/>

    </baseAddresses>

    </host>

    <endpoint address="/Address1"

    binding="basicHttpBinding"

    contract="WCFService.IServiceWindow"/>

    <endpoint address="mex"

    binding="mexHttpBinding"

    contract="IMetadataExchange" />

    </service>

    </services >

    <behaviors>

    <serviceBehaviors>

    <behavior name="WCFService.ServiceWindowBehavior">

    <serviceMetadata httpGetEnabled="true" />

    <serviceDebug includeExceptionDetailInFaults="false" />

    </behavior>

    </serviceBehaviors>

    </behaviors>

    </system.serviceModel>

    </configuration>

    启动代码

    public void Start()

    {

    ServiceHost host = new ServiceHost(typeof(ServiceWindow));

    host.Open();

    }

    private void btnStart_Click(object sender, EventArgs e)

    {

    Start();

    }

    客户端
    如何调用

    1. 启动服务窗体

    clip_image003

    2. 客户端添加服务引用

    clip_image005

    调用代码

    ServiceWindow.ServiceWindowClient myHost3 = new WCFTest.ServiceWindow.ServiceWindowClient();

    Console.WriteLine( myHost3.GetCurrentTime());

    结果:

    clip_image007

    IIS 承载 WCF(略)
    服务端
    服务代码
    配置
    启动代码
    客户端
    如何调用
    调用代码
    Console 承载 WCF
    服务端
    服务代码

    1. 服务接口

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.ServiceModel;

    using System.Text;

    namespace ConsoleService

    {

    [ServiceContract]

    public interface IServiceConsole

    {

    [OperationContract(IsOneWay=false)]

    string GetCurrentTime();

    }

    }

    2. 服务实现

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.ServiceModel;

    using System.Text;

    namespace ConsoleService

    {

    public class ServiceConsole:IServiceConsole

    {

    #region IServiceWindow 成员

    public string GetCurrentTime()

    {

    //ConsoleService.ServiceConsole

    return string.Format("Console Server Time:{0}", DateTime.Now.ToString());

    }

    #endregion

    }

    }

    配置

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

    <system.serviceModel>

    <services>

    <service behaviorConfiguration="ConsoleService.ServiceConsoleBehavior"

    name="ConsoleService.ServiceConsole">

    <host>

    <baseAddresses>

    <add baseAddress="http://localhost:9000/ServiceConsole/"/>

    </baseAddresses>

    </host>

    <endpoint address="/Address2"

    binding="basicHttpBinding"

    contract="ConsoleService.IServiceConsole"/>

    <endpoint address="mex"

    binding="mexHttpBinding"

    contract="IMetadataExchange" />

    </service>

    </services >

    <behaviors>

    <serviceBehaviors>

    <behavior name="ConsoleService.ServiceConsoleBehavior">

    <serviceMetadata httpGetEnabled="true" />

    <serviceDebug includeExceptionDetailInFaults="false" />

    </behavior>

    </serviceBehaviors>

    </behaviors>

    </system.serviceModel>

    </configuration>

    启动代码

    static void Main(string[] args)

    {

    ServiceHost myHost = new ServiceHost(typeof(ServiceConsole));

    myHost.Open();

    Console.Read();

    myHost.Close();

    }

    客户端
    clip_image009
    添加服务引用
    clip_image010
    调用代码
    ServiceConsole.ServiceConsoleClient consoleClinet = new WCFTest.ServiceConsole.ServiceConsoleClient();
    Console.WriteLine(consoleClinet.GetCurrentTime());
    Console.Read();
    Windows Service 承载 WCF
    服务端
    服务代码

    1. 服务接口

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.ServiceModel;

    using System.Text;

    namespace WindowsService

    {

    [ServiceContract]

    interface IServiceTest

    {

    [OperationContract(IsOneWay=false)]

    string GetCurrentTime();

    }

    }

    2. 服务实现

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Runtime.Serialization;

    using System.ServiceModel;

    using System.Text;

    namespace WindowsService

    {

    class ServiceTest:IServiceTest

    {

    #region IServiceWindowService 成员

    public string GetCurrentTime()

    {

    Console.WriteLine("Receive call {0}", DateTime.Now);

    return string.Format("Console Server Time:{0}", DateTime.Now.ToString());

    }

    #endregion

    }

    }

    ServiceBase 类继承来实现 Windows 服务代码

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Diagnostics;

    using System.Linq;

    using System.ServiceProcess;

    using System.Text;

    using System.ServiceModel;

    namespace WindowsService

    {

    public partial class ServiceTestWindowService : ServiceBase

    {

    private ServiceHost serviceHost = null;

    public ServiceTestWindowService()

    {

    InitializeComponent();

    }

    protected override void OnStart(string[] args)

    {

    if (serviceHost != null)

    {

    serviceHost.Close();

    }

    serviceHost = new ServiceHost(typeof(ServiceTest));

    serviceHost.Open();

    }

    protected override void OnStop()

    {

    if(serviceHost!=null)

    {

    serviceHost.Close();

    serviceHost = null;

    }

    }

    }

    }

    Installer 继承类 实现服务安装服务

    using System;

    using System.Collections;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Configuration.Install;

    using System.Linq;

    using System.ServiceProcess;

    namespace WindowsService

    {

    [RunInstaller(true)]

    public partial class Installer1 : Installer

    {

    private ServiceProcessInstaller process;

    private ServiceInstaller service;

    public Installer1()

    {

    InitializeComponent();

    process = new ServiceProcessInstaller();

    process.Account = ServiceAccount.LocalSystem;

    service = new ServiceInstaller();

    service.ServiceName = "WCFWindowsServiceSample";

    Installers.Add(process);

    Installers.Add(service);

    }

    }

    }

    配置代码

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

    <system.serviceModel>

    <services>

    <service name="WindowsService.ServiceTest" behaviorConfiguration="ConsoleService.ServiceConsoleBehavior">

    <host>

    <baseAddresses>

    <add baseAddress="http://localhost:9002/WindowService/ServiceTest"/>

    </baseAddresses>

    </host>

    <!-- this endpoint is exposed at the base address provided by host: http://localhost:8000/ServiceModelSamples/service -->

    <endpoint address=""

    binding="wsHttpBinding"

    contract="WindowsService.IServiceTest" />

    <!-- the mex endpoint is explosed at http://localhost:8000/ServiceModelSamples/service/mex -->

    <endpoint address="mex"

    binding="mexHttpBinding"

    contract="IMetadataExchange" />

    </service>

    </services>

    <behaviors>

    <serviceBehaviors>

    <behavior name="ConsoleService.ServiceConsoleBehavior">

    <serviceMetadata httpGetEnabled="true" />

    <serviceDebug includeExceptionDetailInFaults="false" />

    </behavior>

    </serviceBehaviors>

    </behaviors>

    </system.serviceModel>

    </configuration>

    安装与启动界面

    1. 命令行安装

    installUtil 程序名称

    installutil 程序名称 /u

    clip_image012

    2. 服务启动

    clip_image014

    客户端

    clip_image016

    如何调ServiceWindowService.ServiceTestClient testClient = new WCFTest.ServiceWindowService.ServiceTestClient();

    Console.WriteLine(testClient.GetCurrentTime());用

    l 补充说明:

    ServiceHost 不一定必须在在windows 服务的 OnStart中实现。OnStart

    下面例子演示了这种实现。

    l Service中实现ServiceHost

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.ServiceModel;

    using System.ServiceModel.Description;

    using System.Xml;

    using TPRIBPM.Base.Tools;

    namespace TPRIBPM.Foundation.PWService

    {

    public class WCFService

    {

    private ServiceHost host;

    private Uri serverUrl;

    private TPRIBPM.Foundation.PWDB.PWDBDataContext dataContext ;

    PowerService pwser;

    //http://localhost:7654/PWDB/

    public WCFService(Uri serverUrl)

    {

    try

    {

    string connectionString = MyConfig.getConnection("myconstring");

    if (!string.IsNullOrEmpty(connectionString))

    {

    dataContext = new TPRIBPM.Foundation.PWDB.PWDBDataContext(connectionString);

    }

    else

    {

    dataContext = new TPRIBPM.Foundation.PWDB.PWDBDataContext();

    }

    dataContext.SubmitChanges();

    MyLog.writeInfo("数据库连接成功:" + dataContext.Connection.ConnectionString);

    this.serverUrl = serverUrl;

    pwser = new PowerService(dataContext);

    host = new ServiceHost(pwser, serverUrl);

    host.Closed += new EventHandler(host_Closed);

    host.Opened += new EventHandler(host_Opened);

    host.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(host_UnknownMessageReceived);

    host.Faulted += new EventHandler(host_Faulted);

    ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();

    behavior.HttpGetEnabled = true;

    host.Description.Behaviors.Add(behavior);

    System.ServiceModel.BasicHttpBinding bh = new BasicHttpBinding();

    XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();

    quotas.MaxStringContentLength = 7000000;

    bh.ReaderQuotas = quotas;

    bh.MaxReceivedMessageSize = 7000000;

    host.AddServiceEndpoint(typeof(IPowerService), bh, "PW/");

    }

    catch (System.Exception ex)

    {

    MyLog.writeError(ex.Message);

    throw new MyException(ex.Message);

    }

    }

    void host_Faulted(object sender, EventArgs e)

    {

    MyLog.writeError("WCF-Faulted");

    }

    void host_UnknownMessageReceived(object sender, UnknownMessageReceivedEventArgs e)

    {

    MyLog.writeError("WCF-UnknownMessageReceived");

    }

    void host_Opened(object sender, EventArgs e)

    {

    MyLog.writeInfo("WCF服务已启动,url:" + host.BaseAddresses[0].AbsoluteUri.ToString());

    }

    void host_Closed(object sender, EventArgs e)

    {

    MyLog.writeInfo("WCF服务已停止");

    }

    public int? open()

    {

    try

    {

    if (host.State == CommunicationState.Created)

    {

    host.Open();

    return null ;

    }

    return 1;

    }

    catch (System.Exception ex)

    {

    MyLog.writeError(ex.Message);

    throw new MyException(ex.Message);

    }

    }

    public int? close()

    {

    if (host.State == CommunicationState.Opened)

    {

    host.Close();

    return null;

    }

    else

    {

    return 1;

    }

    }

    }

    }

    l windows服务类中调用serverhost的实现类

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Diagnostics;

    using System.Linq;

    using System.ServiceProcess;

    using System.Text;

    using System.ServiceModel;

    using System.Configuration;

    using TPRIBPM.Foundation.PWService;

    using TPRIBPM.Base.Tools;

    namespace TPRIBPM.Foundation.WinServicePWServer

    {

    /***********************************************************************

    * Module: 权限服务的Windows Service包装

    * Author: hbb0b0@163.com

    * Create Date: 2009/7/27

    * Summary:

    ***********************************************************************/

    public partial class TPRIBPMPWService : ServiceBase

    {

    /// <summary>

    /// PW的WCFService

    /// </summary>

    private WCFService wcfser;

    public TPRIBPMPWService()

    {

    InitializeComponent();

    }

    /// <summary>

    /// 启动

    /// </summary>

    /// <param name="args"></param>

    protected override void OnStart(string[] args)

    {

    string urlAddress = ConfigurationManager.AppSettings["wcfserviceurl"];

    wcfser = new TPRIBPM.Foundation.PWService.WCFService(new Uri(urlAddress));

    int? v = wcfser.open();

    if (v == null)

    {

    MyDebug.write("服务已启动");

    }

    }

    /// <summary>

    /// 关闭

    /// </summary>

    protected override void OnStop()

    {

    close();

    }

    /// <summary>

    /// 关闭方法

    /// </summary>

    void close()

    {

    if (wcfser != null)

    {

    int? v = wcfser.close();

    if (v == null)

    {

    MyDebug.write("服务已停止");

    }

    }

    }

    }

    }

  • 相关阅读:
    数据的增、删、改(jQuery.Ajax)
    tomcat内置jdk(tomcat集成jdk)(windows环境)
    进行数据库进程的杀死
    矩阵与自然基向量
    实对称矩阵
    坐标变换
    设置PySpark的Python版本
    CentOS7中安装Python3.6
    一个矩阵有几个实特征向量
    centos7系统设置固定IP
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1950595.html
Copyright © 2011-2022 走看看