创建宿主程序:用于启动和关闭服务:

WCF不能直接运行,必须寄宿于某个指定的宿主((Windows Forms、Windows服务、WP应用程序等)。

几种常用的寄宿方式:

寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务

具体寄宿Demo案例:可参考此链接地址:常用宿主程序的创建 下面以本项目为例,创建Winform寄宿宿主:

添加CRMMain WinForm 项目:

寄宿服务器虚拟化架构图 寄宿方式有哪些_wcf


控件:启动和关闭服务按钮,以及提示信息label。

首先添加引用:

寄宿服务器虚拟化架构图 寄宿方式有哪些_wcf_02


底层代码:

using CRMServer;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CRMMain
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        ServiceHost serviceHost;
        private void btnStart_Click(object sender, EventArgs e)
        {

            try
            {
                Uri uri = new Uri("http://localhost:8733/Design_Time_Addresses/CRMServer/FileService/");
                serviceHost = new ServiceHost(typeof(FileService), uri);
                //指定元数据,对接接口
                serviceHost.AddServiceEndpoint(typeof(IFileService), new WSDualHttpBinding(), "");
                serviceHost.Open();//开启服务

                this.lblMessage.Text = "服务启动成功!";
                this.btnStart.Enabled = false;
                this.btnClose.Enabled = true;
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "服务启动失败!";

            }
        }

        /// <summary>
        /// 关闭服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, EventArgs e)
        {
            try
            {
                this.lblMessage.Text = "服务正在关闭中....请耐心等待!";
                serviceHost.Close();//关闭服务
                this.lblMessage.Text = "服务正常关闭!";
                this.btnStart.Enabled = true;
                this.btnClose.Enabled = false;
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "服务关闭失败!";
            }
        }
    }
}

在宿主程序中启动和关闭服务:

1.通过ServiceHost创建指定的服务主机对象

2.调用AddServiceEndpoint (Type implementedContract, System.ServiceModel.Channels.Binding binding, string address)

方法添加终结点

3.查看继承关系:

寄宿服务器虚拟化架构图 寄宿方式有哪些_c#_03


调用CommunicationObject父类的Open和Close方法,启动和关闭对应的服务端这边注意:创建WCF服务时,使用的是wcf提供的测试端口:8733,

那我如何在Windows上添加其他端口,用于本项目服务。

防火墙–>高级设置

寄宿服务器虚拟化架构图 寄宿方式有哪些_System_04

入站规则和出站规则:

寄宿服务器虚拟化架构图 寄宿方式有哪些_wcf_05


端口:计算机与外界通讯交流的出入口

入站规则:开放其他远程访问本机服务的入口

出站规则:开放本机访问其他远程服务的出口

新建入站规则:

Step 1: 选择规则类型:选择程序或端口

寄宿服务器虚拟化架构图 寄宿方式有哪些_wcf_06


Step 2: 程序:所有程序

寄宿服务器虚拟化架构图 寄宿方式有哪些_System_07


Step 3: 允许连接

寄宿服务器虚拟化架构图 寄宿方式有哪些_System_08


Step 4:全选

寄宿服务器虚拟化架构图 寄宿方式有哪些_wcf_09


Step 5:输入名称即可(如:8734)

寄宿服务器虚拟化架构图 寄宿方式有哪些_wcf_10


那么进站规则就添加成功,然后添加对应的出站规则。

那么此端口就可以使用了。

更改服务端的App.confign文件中的端口:

<host>
          <baseAddresses>
            <!--基地址-->
            <add baseAddress="http://localhost:8734/Design_Time_Addresses/CRMServer/FileService/" />
          </baseAddresses>
</host>

我们直接重新服务端CRMServer,宿主CRMMain,发现报错,可以直接打开CRMMain.exe直接运行,并在客户端重新添加8734端口的服务。