1、地址( address )
WCF中地址以統一資源標識符(URI)的形式指定,它用來標識消息發送和接受的目的地,并且它由 通訊協議 和 位置路徑 兩部分組成。例如: http://192.168.1.1:8000/ 表明通訊協議為http,位置路徑是 192.168.1.1 的8000端口。位置路徑很好理解,就是IP加端口號。對于初學者往往忽略了其中包含的通訊協議,除了http之外,還可以指定為:
TCP地址
使用TCP協議進行傳輸,其形式為:net.tcp://localhost:8000/
IPC地址
使用net.pipe進行傳輸,其形式為:net.pipe://localhost/
MSMQ地址
使用Microsoft Message Queue
機制
進行傳輸,其形式為:net.msmq://localhost/
對等網地址
使用net.p2p進行傳輸,其形式為:net.p2p://localhost/
下面看看配置文件中的實際例子:
<
host
>
<
baseAddresses
>
<
add
baseAddress
= "http://localhost:8731/"
/>
</
baseAddresses
>
</
host
>
<
endpoint
address
="http://localhost:8731/Service"
binding
="basicHttpBinding"
contract
="Wcf_Address_Config.IService1"
>
</
endpoint
>
也可以寫成相對路徑:
<
host
>
<
baseAddresses
>
<
add
baseAddress
= "http://localhost:8731/"
/>
</
baseAddresses
>
</
host
>
<
endpoint
address
="Service1"
binding
="basicHttpBinding"
contract
="Wcf_Address_Config.IService1"
></
endpoint
>
那么在編程中如何設置地址呢?
EndpointAddress address
=
new
EndpointAddress(
"
http://127.0.0.1:2136/Service1
"
);
Binding binding
=
new
BasicHttpBinding();
wcf.IService1 service
=
new
wcf.Service1Client(binding, address);
2、綁定( binding )
綁定元素表示綁定的特定部分,如傳輸協議、編碼、基礎結構級協議(如 WS-ReliableMessaging)的實現以及通信堆棧的其他任何要素。綁定也是組成服務終結點的三要素之一。WCF基庫中提供了很多可選擇的預綁定:
basicHttpBinding
一個綁定,適用于與符合 WS-Basic Profile 的 Web 服務(例如基于 ASP.NET Web 服務 (ASMX) 的服務)進行的通信。 此綁定使用 HTTP 作為傳輸協議,并使用文本/XML 作為默認的消息編碼。傳輸協議為:HTTP/HTTPS 編碼格式為:Text,MTOM
wsHttpBinding
一個安全且可互操作的綁定,適合于非雙工服務約定。傳輸協議為:HTTP/HTTPS 編碼格式為:Text,MTOM
wsDualHttpBinding
一個安全且可互操作的綁定,適用于雙工服務協定或通過 SOAP 媒介進行的通信。傳輸協議為:HTTP 編碼格式為:Text,MTOM
netTcpBinding
一個安全且經過優化的綁定,適用于 WCF 應用程序之間跨計算機的通信。傳輸協議為:TCP 編碼格式為:Binary
netPeerTcpBinding
一個支持多計算機安全通信的綁定。傳輸協議為:P2P 編碼格式為:Binary
3、契約( contract )
在WCF中一共包含四種契約,1)服務契約:服務契約將多個相干的操作聯系在一起,組成單個功能元素,契約可以定義服務級設置,如果服務的命名空間,對應的回調契約及其其他此類設置。2)數據契約,服務使用的數據類型必須在元數據中進行描述,以使其他各方可以與該服務進行交互操作,數據類型的說明稱謂數據契約,而這些類型可以在消息的任何部分使用,如果服務是用簡單類型,沒有必要顯示使用數據契約。4)數據契約:可以將錯誤契約與服務操作進行關聯,以指示可能返回到調用放的錯誤,一個操作可能具有零各或多個與其相關聯的錯誤,這些錯誤是在編程模型中建模為異常的SOA錯誤,5)消息契約:消息契約描述消息的格式,他會聲明消息元素應包含在消息頭中還是包含在消息正文中,應該對消息的任何元素應用何種級別的安全。契約也是組成服務終結點的三要素之一。
4、終結點( endpoint )
一個終結點有三個要素組成,終結點用來發送或接收消息的構造,一個終結點就相當于服務等公共接口,每個服務可以擁有一個或多個終結點,由于每個服務都只擁有一個地址,所以某個服務擁有的所有終結點共享一個地址,終結點的配置或者編程,并不屬于業務邏輯的編程,所以WCF設計分離了終結點的定義和契約的具體實現。
5、元數據
服務的元數據描述服務的特性,外部實體需要了解這些特性以便于該服務進行通信,服務所公開的元數據包括XML架構文件和WSDL文檔,啟用元數據后,WCF通過檢查服務以及終結點自動生成服務元數據,若要發布服務元數據,必須顯示啟動元數據行為,在WCF中,可以為元數據設置一個專用的終結點。
其配置: < serviceMetadata httpGetEnabled ="True" httpGetUrl ="http://localhost:8731/Service" />
6、宿主
服務必須承載與某個進程中,宿主的控制服務的生存期的應用程序,服務可以是自寄宿,也可以由現有的寄宿進程進行管理,從內部實現來看,一個服務宿主進程,可以包含一個或多個應用程序域,而每個應用程序域理論上有可以被放入到任意個服務宿主,每個服務宿主可以擁由任意個上下文,每個上下文可以有0個或1和服務示例。
最后給出一個msdn中wcf的實例:注意引用 System.ServiceModel.dll
using
System;
using
System.ServiceModel;
using
System.ServiceModel.Description;
namespace
Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace =
"http://Microsoft.ServiceModel.Samples"
)]
public
interface
ICalculator
{
[OperationContract]
double
Add(
double
n1,
double
n2);
[OperationContract]
double
Subtract(
double
n1,
double
n2);
[OperationContract]
double
Multiply(
double
n1,
double
n2);
[OperationContract]
double
Divide(
double
n1,
double
n2);
}
// Service class that implements the service contract.
// Added code to write output to the console window.
public
class
CalculatorService : ICalculator
{
public
double
Add(
double
n1,
double
n2)
{
double
result = n1 + n2;
Console.WriteLine(
"Received Add({0},{1})"
, n1, n2);
Console.WriteLine(
"Return: {0}"
, result);
return
result;
}
public
double
Subtract(
double
n1,
double
n2)
{
double
result = n1 - n2;
Console.WriteLine(
"Received Subtract({0},{1})"
, n1, n2);
Console.WriteLine(
"Return: {0}"
, result);
return
result;
}
public
double
Multiply(
double
n1,
double
n2)
{
double
result = n1 * n2;
Console.WriteLine(
"Received Multiply({0},{1})"
, n1, n2);
Console.WriteLine(
"Return: {0}"
, result);
return
result;
}
public
double
Divide(
double
n1,
double
n2)
{
double
result = n1 / n2;
Console.WriteLine(
"Received Divide({0},{1})"
, n1, n2);
Console.WriteLine(
"Return: {0}"
, result);
return
result;
}
}
class
Program
{
static
void
Main(
string
[] args)
{
// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Uri baseAddress =
new
Uri(
"http://localhost:8000/ServiceModelSamples/Service"
);
// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost =
new
ServiceHost(
typeof
(CalculatorService), baseAddress);
try
{
// Step 3 of the hosting procedure: Add a service endpoint.
selfHost.AddServiceEndpoint(
typeof
(ICalculator),
new
WSHttpBinding(),
"CalculatorService"
);
// Step 4 of the hosting procedure: Enable metadata exchange.
ServiceMetadataBehavior smb =
new
ServiceMetadataBehavior();
smb.HttpGetEnabled =
true
;
selfHost.Description.Behaviors.Add(smb);
// Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open();
Console.WriteLine(
"The service is ready."
);
Console.WriteLine(
"Press <ENTER> to terminate service."
);
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
selfHost.Close();
}
catch
(CommunicationException ce)
{
Console.WriteLine(
"An exception occurred: {0}"
, ce.Message);
selfHost.Abort();
}
}
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

