轉(zhuǎn)帖|其它|編輯:郝浩|2010-12-29 14:38:24.000|閱讀 1024 次
概述:本文主要介紹如何在一個(gè)跨域環(huán)境中用Silverlight客戶端使用自托管的WCF服務(wù),希望對(duì)大家有幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
當(dāng)一個(gè)Silverlight客戶端試圖使用WCF服務(wù)時(shí),默認(rèn)情況下,它只被允許進(jìn)行在原始站點(diǎn)下的通訊。例如,一個(gè)//domainA/default.aspx托管的Silverlight控件默認(rèn)情況下只能使用同一個(gè)域內(nèi)的服務(wù),如://domainA/WCFService.svc。而//domainB/WCFservice.svc則不行。
為了使//domainA/default.aspx托管的Silverlight可以連接到//domainB/WCFservice托管的WCF服務(wù),我們需要顯式配置一個(gè)跨域選擇策略,即clientaccesspolicy.xml或crossdomain.xml。有很多文章與這個(gè)主題相關(guān):
建立可跨網(wǎng)域界限訪問(wèn)的服務(wù)
//msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx
警告:無(wú)法在'<URL>'定位跨域策略
//msdn.microsoft.com/en-us/library/cc838225(VS.95).aspx
當(dāng)我們的WCF服務(wù)托管在IIS中時(shí),我們只需要在發(fā)布WCF服務(wù)的根文件夾中部署clientaccesspolicy.xml。例如:如果我們的WCF服務(wù)發(fā)布為://domainB/WCFservice.svc,那么跨域策略應(yīng)該可以通過(guò)//domainB/clientaccesspolicy.xml訪問(wèn)。
然而,自托管的WCF服務(wù)有些許不同。在這篇文章中,我們將演示Silverlight客戶端如何在一個(gè)跨域環(huán)境中使用自托管的WCF服務(wù)。同時(shí),因?yàn)镾ilverlight4 目前已支持NET.TCP綁定,這些針對(duì)NET.TCP綁定的步驟將與basicHttpBinding完全不同。在這篇文章中,我將分別介紹在basicHttpBinding和NET.TCP 綁定這兩種不同情景下的步驟。
如何使用自托管WCF服務(wù)
場(chǎng)景1:自托管的WCF服務(wù)與basicHttpBinding
步驟1:
定義一個(gè)接口"IPolicyRetriever"
[ServiceContract]
public interface IPolicyRetriever
{
[OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
Stream GetSilverlightPolicy();
[OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
Stream GetFlashPolicy();
}
步驟2:
在你的WCF服務(wù)中實(shí)現(xiàn)上述接口:
public class WCFService:IWCFService,IPolicyRetriever
{
//IWCFService 實(shí)現(xiàn)
...
...
//IPolicyRetriever 實(shí)現(xiàn)
private Stream StringToStream(string result)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
return new MemoryStream(Encoding.UTF8.GetBytes(result));
}
public Stream GetSilverlightPolicy()
{
string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers=""*"">
<domain uri=""*""/>
</allow-from>
<grant-to>
<resource path=""/"" include-subpaths=""true""/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>";
return StringToStream(result);
}
步驟3:
發(fā)布一個(gè)endpoint,地址為"",基于HTTP schema的主機(jī)地址來(lái)為clientaccesspolicy.xml接收請(qǐng)求。我們可以通過(guò)編程或管理的方式達(dá)到此目的。
編程的方式:
Type serviceType = typeof(WCFService);
ServiceHost host = new ServiceHost(serviceType);
host.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
管理的方式:
<behaviors>
<endpointBehaviors>
<behavior name="WebHttpNewBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
...
</behaviors>
<services>
<service behaviorConfiguration="NewBehavior">
...
<endpoint behaviorConfiguration="WebHttpNewBehavior" binding="webHttpBinding"
bindingConfiguration="" name="PolicyEndpoint" contract="WCFService.IPolicyRetriever" />
...
</service>
</services>
在以上步驟之后,當(dāng)一個(gè)Seliverlight控件向跨域自托管的WCF 服務(wù)發(fā)出一個(gè)請(qǐng)求時(shí),這個(gè)服務(wù)端的服務(wù)器應(yīng)該能夠檢索它的客戶端訪問(wèn)策略,然后決定請(qǐng)求是否被授權(quán)。
場(chǎng)景2:自托管的WCF服務(wù)與NET.TCP binding
即使如下文章宣布了Sliverlight4支持NET.TCP binding:
Sliverlight4 中的WCF NET.TCP協(xié)議
//www.silverlightshow.net/items/WCF-NET.TCP-Protocol-in-Silverlight-4.aspx
在開始我們的步驟之前,我想特別指出一些與basicHttpBinding場(chǎng)景不同的地方。
1. 實(shí)際上NET.TCP schema并不能被Silverlight 4識(shí)別。至少當(dāng)前如此。為了使用NET.TCP 綁定,我們需要使用customBinding。
2. TCP 端口范圍被限制在4502-4534,這意味著你的WCF服務(wù)必須在以上端口范圍中發(fā)布,從而使Silverlight客戶端能夠訪問(wèn)它。
為了使客戶端能夠訪問(wèn)策略,在Silverlight4 RC之前,TCP 943端口專門用來(lái)暴露策略。
參考如下文章以獲得更多細(xì)節(jié)信息:
Silverlight中的網(wǎng)絡(luò)安全訪問(wèn)限制
//msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx
為了使我們的工作變得簡(jiǎn)單,Microsoft的Tomasz Janczuk創(chuàng)建了一個(gè)免費(fèi)的針對(duì)那些工作如TCP 套接字策略服務(wù)器的命令行程序的模板。
然而,Silverlight 4 RC中的NET.TCP協(xié)議希望能通過(guò)HTTP協(xié)議在域名的根目錄中訪問(wèn)到套接字策略,而不是像之前那樣通過(guò)TCP協(xié)議在943端口訪問(wèn)到。
參考如下文章以獲悉這個(gè)改變:
Sliverlight 4 中使用WCF net.tcp 協(xié)議的發(fā)布/訂閱例子
//tomasz.janczuk.org/2009/11/pubsub-sample-with-wcf-nettcp-protocol.html
在這里,我們展示針對(duì)于Silverlight 4 RC場(chǎng)景的步驟,這意味著套接字策略通過(guò)HTTP協(xié)議在域名的根目錄下被訪問(wèn)到。
步驟1:
配置WCF 服務(wù)使用customBinding,和一個(gè)基于NET.TCP 模式的元數(shù)據(jù)交換端點(diǎn)。你可以參考如下配置:
<bindings>
<customBinding>
<binding name="NewBinding0">
<binaryMessageEncoding />
<tcpTransport />
</binding>
</customBinding>
</bindings>
...
...
<services>
<service behaviorConfiguration="NewBehavior" name="Demo.WCFService">
<endpoint address="WCFService" binding="customBinding" bindingConfiguration="NewBinding0"
name="ServiceEndpoint" contract=" Demo.IWCFService " />
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
name="MEXEndpoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://[domainB]:4503/" />
</baseAddresses>
</host>
</service>
</services>
步驟2:
將clientaccesspolicy.xml部署到//domainB的根目錄下,以確保clientaccesspolicy.xml能夠通過(guò)//domainB/clientaccesspolicy.xml訪問(wèn)到。clientaccesspolicy.xml的內(nèi)容應(yīng)該與如下相似:
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri="*"/>
</allow-from>
<grant-to>
<socket-resource port="4502-4534" protocol="tcp" />
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
經(jīng)過(guò)如上步驟后,你的Silverlight 應(yīng)該能夠成功地通過(guò)NET.TCP 綁定請(qǐng)求自托管的WCF 服務(wù)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載