澳门1495

WCF WCF的宿主。WCF WCF的宿主。

九月 27th, 2018  |  综合体育

平、WCF服务应用程序与WCF服务库

如出一辙、WCF服务应用程序与WCF服务库

  咱们当平时出之历程被常用的品种类别有“WCF
服务应用程序”和“WCF服务库”。

  咱们以平常开发的历程遭到常用之路项目有“WCF
服务应用程序”和“WCF服务库”。

  WCF服务应用程序,是一个得履的次,它来独立的经过,WCF服务接近契约的概念,可以一直看看运行的机能。此项目模板基于IIS托管的顺序,如依系列之第一省所显示。在开基于IIS托管的WCF服务程序时,比较多见,自学的上吧得采用这种类型,简单容易亮。

  WCF服务应用程序,是一个可实施的次第,它产生独立的过程,WCF服务接近契约的定义,可以一直看出运行的效用。此路模板基于IIS托管的主次,如按照系列的第一节约所展示。在开发基于IIS托管的WCF服务程序时,比较多见,自学的时光吗得使这种类型,简单容易掌握。

  WCF服务库,可以认为是一个带有WCF服务与契约定义之类库。不可知直接运行,你得以另外类型里引用,在宿主里启用托管是库房,有硌类似于我们以Web项目遭到采取之类库。考虑WCF服务计划之时节,服务类的概念为单身的库房,可以啊外门类用。提高代码的复用性。

  WCF服务库,可以认为是一个包含WCF服务和契约定义之类库。不可知直接运行,你可以于另项目里引用,在宿主里启用托管是库房,有硌类似于我们于Web项目遭到以之类库。考虑WCF服务计划之时段,服务类的概念为单身的仓库,可以呢其它品类下。提高代码的复用性。

  当然你呢得以改这些代码,比如把WCF服务程序里之类似,移到一个单身的类库里,或是把类库里的类移到WCF服务程序中。

  当然你啊得改这些代码,比如把WCF服务程序里之好像,移到一个独自的类库里,或是把类库里的类移到WCF服务程序中。

二、概述

二、概述

  通过前的介绍我们知道,WCF在运行时必寄宿在“宿主程序”之上,WCF本身不克单独运行(每个WCF服务得宿主在一个Windows进程被)。.net
提供了多种宿主供WCF运行,WCF还是非常灵活的。

  通过前的介绍我们明白,WCF在运行时必寄宿在“宿主程序”之上,WCF本身不能够单独运行(每个WCF服务得宿主在一个Windows进程被)。.net
提供了余宿主供WCF运行,WCF还是非常灵活的。

图片 1

图片 2

  WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation
Services,Windows进程激活服务)或IIS、Windows应用程序,或略的控制台应用程序及任何.net程序。

  WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation
Services,Windows进程激活服务)或IIS、Windows应用程序,或简捷的控制台应用程序及任何.net程序。

  这节的演示我们重新建WCF类库项目为条例做示范,名称也:WCFLibrary,并剔除自动生成的简单个公文(IService1.cs、Service1.cs)。如下图所示:

  这节之演示我们重新确立WCF类库项目为条例做示范,名称也:WCFLibrary,并删除自动生成的有数个文本(IService1.cs、Service1.cs)。如下图所示:

图片 3

图片 4

  鼠标右键查看项目性质。我们发现,其实“WCF类库项目”与我们平素立之“类库项目”都是类库,只不过多矣WCF的类库项目以新建时差不多矣一定量只dll的援(System.ServiceModel.dll、System.Runtime.Serialization.dll)和一个自动生成的布局文件(该配置文件只用于调试时行使,在WCF寄宿以后会使用宿主的布文件以及另应用程序通信)。这再说明了咱于召开分式程序支付的时光跟我们平素开发的应用程序没有多深之分,只要我们当应用程序间通信时“符合WCF的预约”即可。

  鼠标右键查看项目性质。我们发现,其实“WCF类库项目”与我们平常成立之“类库项目”都是类库,只不过多矣WCF的类库项目以新建时多了少数只dll的援(System.ServiceModel.dll、System.Runtime.Serialization.dll)和一个自动生成的布局文件(该配置文件就用于调试时行使,在WCF寄宿以后会下宿主的布文件以及另应用程序通信)。这还说明了咱于召开分式程序支付的时刻跟我们平素付出之应用程序没有多好之区别,只要我们当应用程序间通信时“符合WCF的约定”即可。

  服务端我们还与第一个科目一样(IUser接口与User实现),只建一个措施做啊我们调用的言传身教代码如下:

  服务端我们尚同率先独学科一样(IUser接口与User实现),只建立一个法做也咱调用的以身作则代码如下:

//添加引用
using System.ServiceModel;

namespace WCFLibrary
{
    [ServiceContract]
    interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}

namespace WCFLibrary
{
    class User : IUser
    {
        public string ShowName(string name)
        {
            string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
            return wcfName;
        }
    }
}
//添加引用
using System.ServiceModel;

namespace WCFLibrary
{
    [ServiceContract]
    interface IUser
    {
        [OperationContract]
        string ShowName(string name);
    }
}

namespace WCFLibrary
{
    class User : IUser
    {
        public string ShowName(string name)
        {
            string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
            return wcfName;
        }
    }
}

出于本的契约为IService,现在的啊IUser,所以安排文件发出一定量介乎使改也:

是因为本的契约为IService,现在的啊IUser,所以安排文件来半点远在使修改为:

<service name=”WCFLibrary.User”>

<service name=”WCFLibrary.User”>

<endpoint address=”” binding=”wsHttpBinding”
contract=”WCFLibrary.IUser”>

<endpoint address=”” binding=”wsHttpBinding”
contract=”WCFLibrary.IUser”>

点击“F5“运行效果使下图所示说明成功:

点击“F5“运行效果使下图所示说明成功:

图片 5

图片 6

二、IIS宿主

二、IIS宿主

  我们以首先省吃,把WCF寄宿在IIS之上,在IIS中宿主一个劳务的重要优点是以来客户端请求时宿主进程会吃电动启动,并且你得依靠IIS来管理宿主进程的生命周期。在开发和采用的历程与Web
Service非常相似。

  我们于第一节约吃,把WCF寄宿在IIS之上,在IIS中宿主一个劳务的重要性优点是于产生客户端请求时宿主进程会为活动启动,并且你可以依靠IIS来管理宿主进程的生命周期。在付出与行使的经过以及Web
Service非常相似。

、控制台应用程序宿主

、控制台应用程序宿主

  建立宿主

  建立宿主

  (1)在解决方案下新建控制高出口项目 WCFHost_Console。

  (1)在解决方案下新建控制高出口项目 WCFHost_Console。

  (2)添加 System.ServiceModel.dll 的引用。

  (2)添加 System.ServiceModel.dll 的引用。

  (3)添加 WCF 服务类库(WCFLibrary)的品类援。

  (3)添加 WCF 服务类库(WCFLibrary)的门类援。

  (4)创建宿主程序,代码如下:

  (4)创建宿主程序,代码如下:

using System;
using WCFLibrary;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCFHost_Console
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建宿主的基地址
            Uri baseAddress = new Uri("http://localhost:8080/User");
            //创建宿主
            using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
            {
                //向宿主中添加终结点
                host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
                //将HttpGetEnabled属性设置为true
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                //将行为添加到Behaviors中
                host.Description.Behaviors.Add(smb);
                //打开宿主
                host.Open();
                Console.WriteLine("WCF中的HTTP监听已启动....");
                Console.ReadLine();
                host.Close();
            }
        }
    }
}
using System;
using WCFLibrary;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace WCFHost_Console
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建宿主的基地址
            Uri baseAddress = new Uri("http://localhost:8080/User");
            //创建宿主
            using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
            {
                //向宿主中添加终结点
                host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
                //将HttpGetEnabled属性设置为true
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                //将行为添加到Behaviors中
                host.Description.Behaviors.Add(smb);
                //打开宿主
                host.Open();
                Console.WriteLine("WCF中的HTTP监听已启动....");
                Console.ReadLine();
                host.Close();
            }
        }
    }
}

(5)运行宿主程序[每当客户端调用时一旦先运行宿主程序],如下图所示:

(5)运行宿主程序[每当客户端调用时如先运行宿主程序],如下图所示:

图片 7

图片 8

  说明宿主建立成。在上例中之所以到”ServiceHost”类,这里只是简短的使,具体要查看”MSDN
ServiceHost”。

  说明宿主建立成。在上例中之所以到”ServiceHost”类,这里只是简短的利用,具体求查看”MSDN
ServiceHost”。

  成立客户端

  树立客户端

  (1)重新树立解决方案–>Web应用程序项目。

  (1)重新建解决方案–>Web应用程序项目。

  (2)添加对劳动的援(在援上右键–>输入我们定义的劳动宿主的基地址(此处为:http://localhost:8080/User)–&gt;前往–&gt;确定),具体请看第一节。

  (2)添加对劳动的援(在援上右键–>输入我们定义之劳动宿主的基地址(此处为:http://localhost:8080/User)–&gt;前往–&gt;确定),具体请看第一节。

图片 9

图片 10

  (3)测试程序要下图所示说明成功(注意:一定要是先行运行我们的宿主程序才行,如果宿主没有打开的话会报错:鉴于目标计算机积极拒绝,无法连接。)。

  (3)测试程序要下图所示说明成功(注意:一定要是先行运行我们的宿主程序才行,如果宿主没有打开的话会报错:鉴于目标计算机积极拒绝,无法连接。)。

图片 11

图片 12

  以这个示例中我们拿Endpoint中之ABC,基地址,Behaviors等还一直写以了代码里,但骨子里用过程中都是失去因配置文件,为了对比说明我们下的例子中会采取安排文件。

  以此示例中我们拿Endpoint中的ABC,基地址,Behaviors等都一直写以了代码里,但实际行使过程中还是失去因配置文件,为了对比说明我们下的例子中会利用安排文件。

**四、Windows应用程序宿主 **

**四、Windows应用程序宿主 **

  建立宿主

  建立宿主

  (1)在化解方案下新建Windows窗体应用程序项目 WCFHost_Form。

  (1)在化解方案下新建Windows窗体应用程序项目 WCFHost_Form。

  (2)添加 System.ServiceModel.dll 的引用。

  (2)添加 System.ServiceModel.dll 的引用。

  (3)添加 WCF 服务类库(WCFLibrary)的花色援。

  (3)添加 WCF 服务类库(WCFLibrary)的种援。

  (4)添加应用程序配置文件App.config。

  (4)添加应用程序配置文件App.config。

  (5)创建宿主程序MainForm窗体,并修改App.config,代码如下:

  (5)创建宿主程序MainForm窗体,并修改App.config,代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WCFLibrary.User">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8081/User"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


using System;
using WCFLibrary;
using System.ServiceModel;
using System.Windows.Forms;
using System.Configuration;

namespace WCFHost_Form
{
    public partial class MainForm : Form
    {
        ServiceHost host;

        public MainForm()
        {
            InitializeComponent();
        }

        //应用程序加载
        private void MainForm_Load(object sender, EventArgs e)
        {
            host = new ServiceHost(typeof(User));
            //打开宿主
            host.Open();
            this.lblState.Text = "WCF中的HTTP监听已启动....";
        }

        //应用程序关闭
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            host.Close();
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="WCFLibrary.User">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8081/User"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


using System;
using WCFLibrary;
using System.ServiceModel;
using System.Windows.Forms;
using System.Configuration;

namespace WCFHost_Form
{
    public partial class MainForm : Form
    {
        ServiceHost host;

        public MainForm()
        {
            InitializeComponent();
        }

        //应用程序加载
        private void MainForm_Load(object sender, EventArgs e)
        {
            host = new ServiceHost(typeof(User));
            //打开宿主
            host.Open();
            this.lblState.Text = "WCF中的HTTP监听已启动....";
        }

        //应用程序关闭
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            host.Close();
        }
    }
}

运转程序要下图所示:

运作程序要下图所示:

图片 13

图片 14

  建立客户端

  建立客户端

  及上边的Console程序一样,这里而引用的地方为:<add
baseAddress=”http://localhost:8081/User"/&gt;

  与上边的Console程序一样,这里而引用的地点为:<add
baseAddress=”http://localhost:8081/User"/&gt;

  于此事例中与Console应用程序不同之凡,我们当Console配置是一直写于先后中的,而于本例中我们应用的凡布文件,区别在一旦写在部署文件被程序运行时一直到布置文件里取出相关的布节去创建ServiceHost类。

  在这例子中以及Console应用程序不同的凡,我们于Console配置是直接写于次中之,而以本例中我们以的凡布文件,区别在一旦写以布置文件中程序运行时直接到布置文件里取出相关的布节去创建ServiceHost类。

五、WAS宿主

五、WAS宿主

  Windows 进程激活服务 (WAS)
概述.aspx)  

  Windows 进程激活服务 (WAS)
概述.aspx)  

  IIS7允许通过HTTP外的合计进行激活和网通信。此条件入开发可透过WCF支持之任何网络协议(包括http、net.tcp、net.pipe、net.msmq)进行通信的WCF服务。部署简单、管理好,这些网络协议在配置时只是像Http一样,直接扔到IIS7齐即可,我们在下面的事例中因net.tcp为商讨也条例。IIS7以下的版只能支持Http的通信。

  IIS7允许通过HTTP外的协议进行激活和网通信。此条件入开发而经WCF支持的旁网络协议(包括http、net.tcp、net.pipe、net.msmq)进行通信的WCF服务。部署简单、管理有利于,这些网络协议在配备时可像Http一样,直接扔到IIS7上即可,我们以底下的例证中为net.tcp为商讨呢例。IIS7以下的本只能支持Http的通信。

  1、确保已经设置IIS7的激活零部件

  1、确保已经安装IIS7的激活零部件

  在采用WAS宿主时,必须确保IIS7的激活零部件安装好。打开“控制面板”–>“打开或关闭Windows功能”–>“功能”,我的机器上早已设置了,如下图所示(WCF激活与非WCF激活):

  以利用WAS宿主时,必须保证IIS7的激活零部件安装好。打开“控制面板”–>“打开或关闭Windows功能”–>“功能”,我之机械及早已装了,如下图所示(WCF激活与非WCF激活):

图片 15

图片 16

  如果没安装,点击“添加新职能”,然后勾选“WCF激活”,如下图所示:

  如果无装,点击“添加新效能”,然后勾选“WCF激活”,如下图所示:

图片 17

图片 18

  安装成功后我们打开IIS,点击“默认网站(任一个网站即可)”–>“绑定”–>“添加”,在类型受到见面油然而生非IIS支持之别种类。如下图所示

  安装成功后我们打开IIS,点击“默认网站(任一个网站即可)”–>“绑定”–>“添加”,在列中会出现非IIS支持的其余类别。如下图所示

图片 19

图片 20

  说明安装成功。

  说明安装成功。

  2、添加net.tcp的网站绑定

  2、添加net.tcp的网站绑定

  以齐图被,我们挑选项目net.tcp,然后于绑定信息被填入“808:*”,点击确定。

  以达成图备受,我们挑选种类net.tcp,然后于绑定信息被填入“808:*”,点击确定。

  3、开通net.tcp的协议 

  3、开通net.tcp的协议 

  以装置成功而在指定的网站及绑定了net.tcp以后,我们还要起通.net.tcp协议,点击我们设布局WCF的网站,在IIS管理器的操作功能区有一致件“高级设置”点击后面世如下图所示高级配置的窗体

  以安成功而在指定的网站及绑定了net.tcp以后,我们还要从头通.net.tcp协议,点击我们设配置WCF的网站,在IIS管理器的操作功能区有平等件“高级设置”点击后面世如下图所示高级配置的窗体

图片 21

图片 22

  于启用的协议中增长net.tcp协议(原来只对http协议支持,现在拿tcp协议追加上去),中间用逗号隔离开,如达到图所显示。

  于启用的商谈被添加net.tcp协议(原来只有对http协议支持,现在将tcp协议追加上去),中间用逗号隔离开,如达到图所展示。

  注意:这几个步骤一个也不克少,否则会产出:“摸不顶具有绑定
NetTcpBinding 的终结点的跟方案 net.tcp 匹配的基址。注册的基址方案是
[http]
”的错误信息。

  注意:这几乎独步骤一个吧未能够少,否则会出现:“寻不至独具绑定
NetTcpBinding 的终结点的同方案 net.tcp 匹配的基址。注册之基址方案是
[http]
”的错误信息。

   4、建立服务程序

   4、建立服务程序

  (1)在化解方案下新建WCF服务应用程序项目 WCFHost_WAS。

  (1)在化解方案下新建WCF服务应用程序项目 WCFHost_WAS。

  (2)建立IUser与User,代码同例二一律。

  (2)建立IUser与User,代码同例二等同。

  (3)修改配置文件代码如下:

  (3)修改配置文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBindConfig">
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MyBehavior" name="WCFHost_WAS.User">
        <endpoint address="" binding="netTcpBinding" contract="WCFHost_WAS.IUser" bindingConfiguration="netTcpBindConfig"></endpoint>
        <!--元数据交换的终结点-->
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior" >
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpBindConfig">
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MyBehavior" name="WCFHost_WAS.User">
        <endpoint address="" binding="netTcpBinding" contract="WCFHost_WAS.IUser" bindingConfiguration="netTcpBindConfig"></endpoint>
        <!--元数据交换的终结点-->
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior" >
          <serviceMetadata/>
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

(5)部署服务

(5)部署服务

  像另的Web应用程序一样,把有关的文件丢到劳动器端指定目录即可。

  像另的Web应用程序一样,把相关的文件丢到服务器端指定目录即可。

  鼠标右键浏览User.svc,如现如下所示:

  鼠标右键浏览User.svc,如现如下所示:

图片 23

图片 24

  说明部署成功,如达到所显示之劳动地方也:net.tcp://服务器名/User.svc/mex

  说明部署成功,如达到所展示之服务地方为:net.tcp://服务器名/User.svc/mex

  (6)建立客户端

  (6)建立客户端

  建客户端也与另外的一样,如下图所示:

  确立客户端也同其余的平,如下图所示:

图片 25

图片 26

  我们这看客户端的部署文件:

  我们这时候看客户端的布置文件:

<client>
      <endpoint address="http://localhost:8080/User" binding="wsHttpBinding"
        contract="WCFHost_Console.IUser" />
      <endpoint address="http://localhost:8081/User" binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IUser" contract="WCFHost_Form.IUser"
        name="WSHttpBinding_IUser">
        <identity>
          <userPrincipalName value="WIN-EOUTAA4CP4O\Administrator" />
        </identity>
      </endpoint>
      <endpoint address="net.tcp://win-eoutaa4cp4o/User.svc" binding="netTcpBinding"
        bindingConfiguration="NetTcpBinding_IUser" contract="WCFHost_WAS.IUser"
        name="NetTcpBinding_IUser" />
    </client>
<client>
      <endpoint address="http://localhost:8080/User" binding="wsHttpBinding"
        contract="WCFHost_Console.IUser" />
      <endpoint address="http://localhost:8081/User" binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IUser" contract="WCFHost_Form.IUser"
        name="WSHttpBinding_IUser">
        <identity>
          <userPrincipalName value="WIN-EOUTAA4CP4O\Administrator" />
        </identity>
      </endpoint>
      <endpoint address="net.tcp://win-eoutaa4cp4o/User.svc" binding="netTcpBinding"
        bindingConfiguration="NetTcpBinding_IUser" contract="WCFHost_WAS.IUser"
        name="NetTcpBinding_IUser" />
    </client>

咱俩当一个Web应用程序中调用了三种植不同宿主的服务。 

俺们当一个Web应用程序中调用了三种不同宿主的劳务。 

七、总结

七、总结

  通过上面的几乎单例子,我们兑现了控制台宿主、Form宿主、WAS宿主(基于TCP协议)的落实。在骨子里的开支进程遭到,有时候我们还见面为此到因Windows服务之宿主,但大多数卖还使IIS做宿主,方便、快捷。

  通过地方的几独例证,我们贯彻了控制台宿主、Form宿主、WAS宿主(基于TCP协议)的兑现。在事实上的付出过程被,有时候我们尚会见就此到因Windows服务的宿主,但多数客都下IIS做宿主,方便、快捷。

 

 

原文链接:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/01/2706353.html

初稿链接:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/01/2706353.html

相关文章

标签:,

Your Comments

近期评论

    功能


    网站地图xml地图