日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

WCF学习之三, 寄宿方式 代码,配置文件

發(fā)布時(shí)間:2023/12/18 编程问答 30 如意码农
生活随笔 收集整理的這篇文章主要介紹了 WCF学习之三, 寄宿方式 代码,配置文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

可以通過(guò)代碼或者配置文件寄宿WCF服務(wù),在使用過(guò)程中的一些心得,記錄一下,方便后續(xù)查閱。

預(yù)備知識(shí),幾個(gè)地址的作用

1、 behavior.HttpGetUrl  定義元數(shù)據(jù)的地址,如果不定義基地址,則必須定義HttpGetUrl ,是The absolute or relative location of the metadata.

2、baseAddresses 服務(wù)的地址,因?yàn)樵獢?shù)據(jù)(metadata)是屬于一個(gè)host的,并不屬于一個(gè)endpoint。此基地址就是客戶(hù)端添加服務(wù)引用的地址,

所以baseAddress解決了Where to locate the WCF Service?

如果定義endpoint daaress="",則endpoint daaress就等于baseAddresses

3、終結(jié)點(diǎn)endpoint address ,用于和客戶(hù)端通信,服務(wù)端與客戶(hù)端endpoint的address必須嚴(yán)格對(duì)應(yīng)。

4、在這三個(gè)地址中如果沒(méi)有定義基地址則另外兩個(gè)地址HttpGetUrl,endpoint address必須都不能為空

5、如果定義了baseaddress,則另外兩個(gè)地址均可為空。此時(shí)endpoint address就是baseaddress定義的url

如服務(wù)端終結(jié)點(diǎn)配置為:

<endpoint address="http://127.0.0.1:8882/DBServer" binding="wsHttpBinding"  contract="IContract.IContract" />

即服務(wù)端定義address為"http://127.0.0.1:8882/DBServer" ,那么客戶(hù)端的終結(jié)點(diǎn)address也必須為"http://127.0.0.1:8882/DBServer" 才可以建立通訊。

當(dāng)我們Host一個(gè)WCF Service的時(shí)候,我們必須給他定義一個(gè)或多個(gè)Endpoint,然后service通過(guò)這個(gè)定義的Endpoint進(jìn)行監(jiān)聽(tīng)來(lái)自Client端的請(qǐng)求。當(dāng)我們的Application需要調(diào)用這個(gè)Service的時(shí)候,因?yàn)镃lient 和Service是通過(guò)Endpoint的進(jìn)行通信的, 所以我們必須為我們的Application定義Client端的Endpoint。只有當(dāng)Client的Endpoint和Service端某個(gè)Endpoint相互匹配(Service端可以為一個(gè)Service定義多個(gè)Endpoint),Client端的請(qǐng)求才能被Service端監(jiān)聽(tīng)到。也就是說(shuō),我們只有在Client具有一個(gè)與Service端完全匹配的Endpoint,我們才能調(diào)用這個(gè)Service。而這種匹配是比較嚴(yán)格的,比如從匹配Address方面,Client端和Service端的Endpoint Address不僅僅在URI上要完全匹配Service, 他們的Headers也需要相互匹配。對(duì)于Binding, 一般地,Client需要有一個(gè)與Service端完全一樣的Binding,他們之間才能通信。

4、如果定義了基地址,則endpoint address可以設(shè)為空,這樣所有endpoint的address就是基地址所定義的url

以下是一個(gè)建立wcf服務(wù)及調(diào)用的例子

1、新建一個(gè)控制臺(tái)項(xiàng)目,添加以下程序集引用

using System.ServiceModel;
using System.ServiceModel.Web;

2、添加類(lèi)IContract,只是為了演示,Contract和Service都建在一個(gè)項(xiàng)目里面了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace IContract //注意:如果命名空間為WCFHost,則在采用配置文件寄宿服務(wù)的時(shí)候會(huì)不認(rèn)配置文件,不知道為什么
{
[ServiceContract]
public interface IContract
{
[OperationContract]
[WebInvoke(UriTemplate = "Add/{x}/{y}")]
double Add(double x, double y); } }

 3、添加類(lèi)DBService

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DBService //注意:如果命名空間為WCFHost,則在采用配置文件寄宿服務(wù)的時(shí)候會(huì)不認(rèn)配置文件,不知道為什么
{
public class DBService:IContract.IContract
{
public double Add(double x, double y)
{
return x+y;
}
}
}

4、使用代碼方式配置服務(wù)并開(kāi)啟服務(wù),三個(gè)地址都進(jìn)行了定義

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WCFHost
{
class Program
{
static void Main(string[] args)
{
try
{
//Uri uri = new Uri("http://127.0.0.1:8881/DBServer"); //和下面一句等價(jià)
Uri uri = new Uri("http://localhost:8881/DBServer"); using (ServiceHost host = new ServiceHost(typeof(DBService.DBService), uri))
{
//定義元數(shù)據(jù)發(fā)布方式,此處 通過(guò)在服務(wù)所在的URL后加“?wsdl”的方式公布WSDL,可直接通過(guò)HTTP訪(fǎng)問(wèn)得到。
System.ServiceModel.Description.ServiceMetadataBehavior behavior = new System.ServiceModel.Description.ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
//此句也可不要,HttpGetUrl定義元數(shù)據(jù)的url
behavior.HttpGetUrl = new Uri("http://localhost:8882/DBService");
host.Description.Behaviors.Add(behavior); Uri endpointAddress =new Uri("http://127.0.0.1:8883/DBServer"); //添加終結(jié)點(diǎn)
host.AddServiceEndpoint(typeof(IContract.IContract), new WSHttpBinding(), endpointAddress); ////定義終結(jié)點(diǎn)地址(如果定義了baseadress,終結(jié)點(diǎn)地址也可為空)
//host.AddServiceEndpoint(typeof(IContract.IContract), new WSHttpBinding(), ""); host.Opened += host_Opened;
host.Open();
Console.ReadLine();
}
}
catch (Exception e)
{
throw e;
}
} static void host_Opened(object sender, EventArgs e)
{
Console.WriteLine("DBService opened successful");
}
}
} 

5、使用配置文件配置服務(wù)并開(kāi)啟服務(wù),作用同4

5.1 添加配置文件,配置文件中定義了三個(gè)address,基地址(服務(wù)地址),元數(shù)據(jù)地址、與客戶(hù)端的通訊地址

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8881/DBServer"></serviceMetadata>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--注意此處name必須與第三步服務(wù)的命名空間一致-->
<service behaviorConfiguration="metadataBehavior" name="DBService.DBService">
<endpoint address="http://127.0.0.1:8882/DBServer" binding="wsHttpBinding" contract="IContract.IContract" />
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:8883/DBServer"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

5.2 開(kāi)啟服務(wù)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WCFHost
{
class Program
{
static void Main(string[] args)
{
try
{
ServiceHost host1 = new ServiceHost(typeof(DBService.DBService));
host1.Opened += host_Opened;
host1.Open();
Console.ReadLine();
}
catch (Exception e)
{
throw e;
}
} static void host_Opened(object sender, EventArgs e)
{
Console.WriteLine("DBService opened successful");
}
}
}

6、在瀏覽器中打開(kāi)服務(wù)地址:http://127.0.0.1:8883/DBServer,如下圖

打開(kāi)元數(shù)據(jù)地址:http://127.0.0.1:8881/DBServer,如下圖

客戶(hù)端添加服務(wù),使用服務(wù)地址或者元數(shù)據(jù)地址均可找到服務(wù)。

而終結(jié)點(diǎn)地址:http://127.0.0.1:8882/DBServer,無(wú)法打開(kāi),

7、在客戶(hù)端調(diào)用服務(wù)時(shí),定義終結(jié)點(diǎn)address必須服務(wù)定義的終結(jié)點(diǎn)address匹配,如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WCFClient
{
class Program
{
static void Main(string[] args)
{
WSHttpBinding binding = new WSHttpBinding();
EndpointAddress address = new EndpointAddress(new Uri("http://127.0.0.1:8882/DBServer"));
ServiceReference1.ContractClient client = new ServiceReference1.ContractClient(binding, address);
double i = client.Add(1, 2);
Console.WriteLine(i);
Console.ReadLine();
}
}
}

8、只定義baseAddress,不定義其他兩個(gè)address

8.1 配置文件定義

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--注意此處name必須與第三步服務(wù)的命名空間一致-->
<service behaviorConfiguration="metadataBehavior" name="DBService.DBService">
<endpoint address="" binding="wsHttpBinding" contract="IContract.IContract" />
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:8883/DBServer"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

  開(kāi)啟服務(wù)

                ServiceHost host1 = new ServiceHost(typeof(DBService.DBService));
host1.Opened += host_Opened;
host1.Open();
Console.ReadLine();

  

8.2 代碼定義并開(kāi)啟服務(wù)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WCFHost
{
class Program
{
static void Main(string[] args)
{
try
{
//Uri uri = new Uri("http://127.0.0.1:8881/DBServer"); //和下面一句等價(jià)
Uri uri = new Uri("http://localhost:8881/DBServer"); using (ServiceHost host = new ServiceHost(typeof(DBService.DBService), uri))
{
//定義元數(shù)據(jù)發(fā)布方式,此處 通過(guò)在服務(wù)所在的URL后加“?wsdl”的方式公布WSDL,可直接通過(guò)HTTP訪(fǎng)問(wèn)得到。
System.ServiceModel.Description.ServiceMetadataBehavior behavior = new System.ServiceModel.Description.ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(behavior); host.AddServiceEndpoint(typeof(IContract.IContract), new WSHttpBinding(), ""); host.Opened += host_Opened;
host.Open();
Console.ReadLine();
}
}
catch (Exception e)
{
throw e;
}
} static void host_Opened(object sender, EventArgs e)
{
Console.WriteLine("DBService opened successful");
}
}
}

  8.3 客戶(hù)端,直接添加服務(wù)引用會(huì)自動(dòng)生成配置文件,然后調(diào)用

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IContract" />
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8881/DBServer" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IContract" contract="ServiceReference1.IContract"
name="WSHttpBinding_IContract" />
</client>
</system.serviceModel>
</configuration>

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WCFClient
{
class Program
{
static void Main(string[] args)
{
ServiceReference1.ContractClient client = new ServiceReference1.ContractClient(); double i = client.Add(1, 2);
Console.WriteLine(i);
Console.ReadLine(); }
}
}

  8.4 也可不用配置文件,通過(guò)代碼直接調(diào)用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web; namespace WCFClient
{
class Program
{
static void Main(string[] args)
{ WSHttpBinding binding = new WSHttpBinding();
EndpointAddress address = new EndpointAddress(new Uri("http://127.0.0.1:8881/DBServer"));
ServiceReference1.ContractClient client = new ServiceReference1.ContractClient(binding, address);
client.Endpoint.Binding = binding; double i = client.Add(1, 2);
Console.WriteLine(i);
Console.ReadLine(); }
}
}

  9、比較WCF發(fā)布元數(shù)據(jù)的兩種方式,不管哪種方式ServiceMetadata節(jié)點(diǎn)必須存在。

元數(shù)據(jù)描述服務(wù)的細(xì)節(jié),導(dǎo)出以及發(fā)布元數(shù)據(jù),都是由一個(gè)服務(wù)中的ServiceMetadataBehavior實(shí)現(xiàn)的。

必須為服務(wù)配置ServiceMetadata行為,即配置節(jié)點(diǎn),才能為發(fā)布元數(shù)據(jù),才能再使用httpGetEnabled=true或者h(yuǎn)ttpGetEnabled=false發(fā)布元數(shù)據(jù)。

<serviceBehaviors>

<behavior name="metadataBehavior">
      <serviceMetadata  />
   </behavior>
</serviceBehaviors>

9.1 WSDL,此方式通過(guò)在服務(wù)的URL后加“?wsdl”的方式公布WSDL,可直接通過(guò)HTTP訪(fǎng)問(wèn)。

   設(shè)置httpGetEnabled="true" 發(fā)布元數(shù)據(jù)(圖片見(jiàn)上面步驟6),設(shè)置為false不發(fā)布元數(shù)據(jù)。以下為設(shè)置為false的情況:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<!--<serviceMetadata httpGetEnabled="true" />--> <!--設(shè)置為true公布元數(shù)據(jù),服務(wù)可以開(kāi)啟,客戶(hù)端也可以訪(fǎng)問(wèn)服務(wù)-->
<serviceMetadata httpGetEnabled="false" /> <!--設(shè)置為false不公布元數(shù)據(jù),服務(wù)可以開(kāi)啟,但是客戶(hù)端無(wú)法訪(fǎng)問(wèn)服務(wù)-->
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--注意此處name必須與第三步服務(wù)的命名空間一致-->
<service behaviorConfiguration="metadataBehavior" name="DBService.DBService">
<endpoint address="" binding="wsHttpBinding" contract="IContract.IContract" />
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:8883/DBServer"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

設(shè)置為false的情況:

  

9.2 MEX:此方式以一般的終結(jié)點(diǎn)方式公布,支持各種協(xié)議:http、tcp、NamedPipe

注意:以終結(jié)點(diǎn)的方式公開(kāi)的元數(shù)據(jù),無(wú)法通過(guò)瀏覽器查看元數(shù)據(jù)內(nèi)容

添加mex終結(jié)點(diǎn)發(fā)布元數(shù)據(jù),此時(shí)httpGetEnabled設(shè)置為true和false均可訪(fǎng)問(wèn)服務(wù),只是元數(shù)據(jù)發(fā)布方式不同。

有mex終結(jié)點(diǎn),httpGetEnabled="true",此時(shí)服務(wù)可以開(kāi)啟,客戶(hù)端也可以訪(fǎng)問(wèn)服務(wù),元數(shù)據(jù)以wsdl方式發(fā)布。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true" /> <!--設(shè)置true,則以wsdl方式發(fā)布-->
<!--<serviceMetadata httpGetEnabled="false" />--> <!--設(shè)置false,則以mex方式發(fā)布-->
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--注意此處name必須與第三步服務(wù)的命名空間一致-->
<service behaviorConfiguration="metadataBehavior" name="DBService.DBService">
<endpoint address="" binding="wsHttpBinding" contract="IContract.IContract" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:8883/DBServer"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

  

有mex終結(jié)點(diǎn),httpGetEnabled="false",此時(shí)服務(wù)可以開(kāi)啟,客戶(hù)端也可以訪(fǎng)問(wèn)服務(wù),元數(shù)據(jù)以mex方式發(fā)布。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<!--<serviceMetadata httpGetEnabled="true" />--> <!--設(shè)置true,則以wsdl方式發(fā)布-->
<serviceMetadata httpGetEnabled="false" /> <!--設(shè)置false,則以mex方式發(fā)布-->
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<!--注意此處name必須與第三步服務(wù)的命名空間一致-->
<service behaviorConfiguration="metadataBehavior" name="DBService.DBService">
<endpoint address="" binding="wsHttpBinding" contract="IContract.IContract" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:8883/DBServer"/>
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>

  

例子的源代碼

 參考:

我的WCF之旅(2):Endpoint Overview

WCF公開(kāi)服務(wù)元數(shù)據(jù)方式

整理一下思路,探討WCF(二)

WCF元數(shù)據(jù)發(fā)布的2種方式:httpGetEnabled與mex

WCF 第五章 導(dǎo)出并發(fā)布元數(shù)據(jù)(服務(wù)行為)

如何:使用代碼發(fā)布服務(wù)的元數(shù)據(jù)

《我的WCF之旅》博文系列匯總

總結(jié)

以上是生活随笔為你收集整理的WCF学习之三, 寄宿方式 代码,配置文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。