2009-02-04 70 views
1

我正在學習有關WCF Web服務的知識,我很擔心所見到的所有耦合。我看到它的方式,我應該能夠編寫一個組件,然後在任何地方使用它 - 在proc中,跨Intranet或從一個ASP.NET頁面,只需要改變託管方式。WCF Web服務組件是否必須連接到Web?

一旦你開始與System.ServiceModel.Web雖然你開始的東西裝飾你的ServiceOperations喜歡的工作:

[OperationContract] 
[WebGet] 
string EchoWithGet(string s); 

這一權利是耦合的方法到網上。你可以在一個要託管的服務中使用這樣的合同嗎?

和部分我期待在我的例子中我也看到類似的代碼:

public class FavoriteMovieService : IFavoriteMovie 
{ 
    MyFavoriteMovie item = new MyFavoriteMovie(); 

    public MyFavoriteMovie GetItem() 
    { 
    if(item == null) 
     throw new WebProtocolException(HttpStatusCode.NotFound, "Not found.", null); 
    return item; 
    } 
} 

你不會想扔一樣,在您的服務代碼異常,如果你是在舉辦-proc,對嗎?

是否仍然有很好的方法來編寫WCF Web服務,並希望RESTful的那些不需要如此緊密耦合到Web?它似乎擊敗了WCF的全部目的。

我意識到我可能只是誤解了一些東西,因爲我是做這些類型的WCF服務的新手,但我很好奇。

請賜教。 :)

回答

1

是的,您可以將該合同用於非網絡端點。它只會使用RESTful命令,如果您使用識別此事件的端點(WebHttpBinding自.NET 3.5 sp1起)。否則,它將像任何其他數據合同一樣行事。如果你使用命名管道,這將是很好的inproc。另外,使用WebHTTPBinding將徹底摧毀servicehost中任何其他端點公開元數據的能力。如果你需要這樣做,你應該創建兩個獨立的服務主機。一個用於RESTful服務,另一個用於其他所有服務。這是幾個小時的調試。

至於錯誤,它是一個人爲的例子。我會讓WCF處理所有通信級別的錯誤,並只拋出您可以在其他端點處理的錯誤。否則,返回包含您的其他端點實際可以處理的某種錯誤代碼的消息。此外,只要異常使您的對象處於一致狀態,就吃掉它,不要讓通道出故障。

在相關說明中,我發現爲inproc調用創建接口解析器對象更容易。它的行爲(主要)像servicehost,除了我不需要客戶端,我可以要求對象爲我解決接口。對於inproc調用,WCF開銷有點大。

+0

入門套件中的所有擴展方法等有什麼意義?你可以在服務層之外使用它們嗎?如果沒有,那麼他們不會使用它們將組件連接到網絡上? – 2009-02-04 04:15:00