WebService尋址開始,總結一下WCF中的幾種地址。
如果以HTTP將SOAP從客戶端發往服務端,通過HTTP協議的標准動作如Get、Post進行操作,
服務處理完畢以后再通過HTTP響應發往客戶端這樣一次交互就完成了。可事實上,SOAP沒有標准
方法來指定消息的目的地址、如何返回響應以及錯誤在哪等。如果消息交互變得復雜一點,這種問題
就無法解決。如:由客戶端發出去的消息需經過多個服務路由處理。
終結點應用、消息報 頭。它可以用於在WebService中傳達Service Endpoint所需要的信息,
也可為消息在WebService間傳送提供地址。
如下所示顯示終結點應用所需的信息集
<wsa:Address>xs:anyURI</wsa:Address>
<wsa:ReferenceProperties>... </wsa:ReferenceProperties> ?
<wsa:ReferenceParameters>... </wsa:ReferenceParameters> ?
<wsa:PortType>xs:QName</wsa:PortType> ?
<wsa:ServiceName PortName= " xs:NCName "?>xs:QName</wsa:ServiceName> ?
<wsa:Policies> ... </wsa:Policies>?
<xs:any/>*
</wsa:EndpointReference>
在終結點應用所需的信息集中只有<wsa:Address>xs:anyURI</wsa:Address>是必須的,其他幾個都是可選的。
消息報頭:它是WebService尋址中定義了一些標准的SOAPHeader,它擴展並添加到SOAPHeader中。
即EndpointAddress,即SOAP消息的"To"指向的地址。
{
// Fields
private EndpointAddress address;
private Uri listenUri;
private ListenUriMode listenUriMode;
// 其他屬性
}
WCF客戶端與服務端交互是通過物理地址,即監聽地址實現的。在WCF中,服務通過物理地址
在制定的位置監聽傳入的消息。在WCF配置中,<endpoint>元素中address屬性指定的即為邏輯
地址;listenUri指定物理地址。除非通過listenUri指定,一般邏輯地址與物理地址是相同的。
如果服務端配置了物理地址,在客戶端通過ClientViaBehavior告之Client服務端所使用的物理地址。
address= " net.tcp://127.0.0.1:9999/CalculatorService "
binding= " netTcpBinding " contract= " Contracts.ICalculator " listenUri= " net.tcp://127.0.0.1:3333/CalculatorService " />
Client端配置如下:
使用物理地址,客戶端通過與服務端相同的物理地址發送消息。那么邏輯地址有什么用呢。?看看
EndpointAddressMessageFilter的Match方法的簽名:
{
if (message == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull( " message ");
}
Uri to = message.Headers.To;
Uri uri = this.address.Uri;
return (((to != null) && this.comparer.Equals(uri, to)) && this.helper.Match(message));
}
public override bool Match(MessageBuffer messageBuffer)
{
bool flag;
if (messageBuffer == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull( " messageBuffer ");
}
Message message = messageBuffer.CreateMessage();
try
{
flag = this.Match(message);
}
finally
{
message.Close();
}
return flag;
}
基地址、相對地址、絕對地址都是相對Endpoint來說的。
3.1 基地址:
在<host>下的子元素<baseAddresses>下通過<add>指定,如下:
<baseAddresses>
<add baseAddress="http://127.0.0.1:8888/Calculator"/>
</baseAddresses>
</host>
3.2 相對地址:
在<Endpoint >的<Address>屬性中指定非完全限定地址。使用基地址時就無需為<Endpoint >指定絕對地址了。如下:
3.3 絕對地址:
直接在<Endpoint >的<Address>屬性指定的終結點的完全限定地址。如:“
address= " http://127.0.0.1:8888/CalculatorServices "
binding= " basicHttpBinding " contract= " Contracts.ICalculator " >
</endpoint>
看看對基地址、相對地址、絕對地址作如下配置是什么結果:
address=""
binding="basicHttpBinding" contract="Contracts.ICalculator" >
</endpoint>
<endpoint
address="Service"
binding="basicHttpBinding" contract="Contracts.ICalculator" >
</endpoint>
<endpoint
address="http://127.0.0.1:8888/CalculatorServices"
binding="basicHttpBinding" contract="Contracts.ICalculator" >
</endpoint>
<endpoint
address="http://127.0.0.1:9999/CalculatorService"
binding="basicHttpBinding" contract="Contracts.ICalculator" listenUri="http://127.0.0.1:3333/CalculatorService" listenUriMode="Unique">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:8888/Calculator"/>
</baseAddresses>
</host>
通過C# 控制台看看地址信息:
ServiceEndpointCollection serviceEndpoints = serviceDescription.Endpoints;
foreach ( var serviceEndpoint in serviceEndpoints)
{
Console.WriteLine( " ---------------------------- ");
Console.WriteLine( " 邏輯地址: "+serviceEndpoint.Address.Uri);
Console.WriteLine( " 物理地址: " + serviceEndpoint.ListenUri);
}
