天天看點

WCF Data Service與net.tcp承載分析

今天WCF Data Service部署在支援net.tcp的IIS站點上時會出現問題,通過分析和查找相關資料有了一些結論。

架構預設支援的綁定在web.config設定了

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

可見IIS的運作采用的就不是WAS形式,而是和Asp.net混合的形式,這種情況下,需要支援net.tcp的WCF服務無法在IIS中承載如何檢視已有的綁定的Endpoint的配置資訊:

然後設定svc中的服務承載:

在VS跟蹤器中可以檢視到Endpoint和其對應的ABC資訊,當然我們在這修改一些Behavior Binding等資訊以改變預設的行為,以實作定制,而且定制也僅限于此,如果想進行Endpoint的定制那就比較複雜了,見下一節。

以上把斷點設定在Debug.WriteLine可以跟蹤看到預設實作的DataServiceHost的綁定和契約如下

Binding : WebHttpBinding

Contract: System.Data.Services.IRequestHandler

錯誤現象

如果部署在IIS中,隻要IIS支援net.tcp,就會出現如下錯誤

The provided URI scheme 'net.tcp' is invalid; expected 'http'. Parameter name: context.ListenUriBaseAddress

WCF DataService的預設實作的是不支援TCP的,不過Silverlight4已經可以支援tcp協定,是以增加這個形式的支援看來也是必要的,下一個版本不知能否增加。

實際中為什麼需要TCP

假如我們在既支援遠端又支援區域網路環境下時下了WCF Service,同時又想類似WCF Data Service公布一個資料服務【這樣對于資料的操作符等文法和WCF Data Service一緻,那我們對于服務接口可以簡化很多,不用自己反複寫了,否則WCF 的查詢和操作方法都要定義】,那tcp對于區域網路是 更好的選擇

分析已有的元件可以更清楚如何去做:

System.Data.Services.dll: 包含了服務的承載和預設的Endpoint和屬性加入以及實作HTTP請求處理的HTTPModule,這樣就實作了請求上來的HTTP請求自動跳轉到服務上,同時預設實作的一些查詢等可以直接使用

如上,兩者配合實作用戶端可定制的各種查詢和操作同時服務端通過一個架構支援,不用再編寫重複的代碼了。支援net.tcp也就是在這些基礎庫上增加一個Endpoint,雖然是使用reflector可以看到大概,不過要實作估計還是比較大的工作量,如果自己寫個架構,那可以按照以上兩個元件的思路處理就可以實作WCF Data Service形式的服務,不過這個是一個架構的活,希望在下一版本的WCF Data Service能提供這樣的支援。

以上的跟蹤為了清楚的看到用戶端端代理在LINQ基礎上傳遞的HTTP請求,可以使用Http Analyzer或其他工具檢視詳細資訊

現有的軟體如何做

對于既部署了tcp形式的wcf服務又想使用WCF Data Service的項目一個常見的可能解決方法:

将TCP服務和http協定的服務部署在IIS中的一個根應用下

将wcf data service部署在該根下的一個子應用下

參考:

<a href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/d6388487-27c1-4023-9825-71fb50596a8f">http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/d6388487-27c1-4023-9825-71fb50596a8f</a>