2010-02-15 28 views
2

我有類似這樣的界面:WCF RESTful服務使用界面與泛型

[ServiceContract] 
public interface IBaseService<T> 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<T> LoadById(string value); 

    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<T> Load(string field, string value); 
} 

這些方法會在幾個服務中實現。實施的一個例子是這樣的:

[ServiceContract] 
[ServiceKnownType(typeof(ObjectDTO))] 
public interface IObjectService : IBaseService<ObjectDTO> 
{ 
} 

我的問題是,是否有可能使用使用在基本的服務接口的OperationContracts UriTemplates這個架構設定RESTful服務?我試着四處搜尋,但沒有看到其他人試圖以這種方式設置他們的RESTful服務。

回答

3

這純粹是我的HO,但我強烈建議您嘗試使用OpenRasta,而不是在WCF中添加一個後續對基於RPC的框架REST支持。這在OpenRasta中當然是可能的。

+0

+1 @Anton:嘿,告訴我們你真的*認爲! – 2010-02-15 14:17:51

+0

@Ruben嗯......你是什麼意思? – 2010-02-15 14:18:33

+0

我鼓掌稱,本着自以爲是的框架精神,您以這樣明確的詞語陳述您的答案。 (也就是說,翻譯爲「不要阻止男人 - 你現在努力想成爲PC」)(並且想要同時推薦一個好的答案) – 2010-02-15 14:25:49

1

繼承與Web服務是我一直髮現很難實現的東西,因此我強烈建議不要這樣做。而應考慮將您的Web服務構建爲存根,然後調用共享邏輯,其結構與您所做的相似。

如果您想要一種輕鬆創建無配置的Web服務的方法,您應該查看servicestack.net。這是一個開放源代碼的Web服務框架,它使您可以在不使用任何端點配置,服務或操作合同的情況下創建REST完整的JSON和XML Web服務 - 僅使用POCO DataContracts。這裏是一個live example顯示需要通過創建Ajax和Silverlight客戶端叫簡單的REST Web服務的客戶端和服務器代碼:鑑於REST服務的使用,我不知道有使用泛型的任何一點的方式

1

。當您切換到動態傳輸時,您將失去強大打字的所有好處。

JSON序列化是動態的,不能識別類型,那麼爲什麼你需要強類型輸出?

[ServiceContract] 
public interface IBaseService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<object> LoadById(string value); 

    [OperationContract] 
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<object> Load(string field, string value); 
} 

將產生相同的JSON輸出。

鑑於我認爲你最好的選擇就是不使用REST中的泛型。

+0

由於事實上我使用泛型並定義了ServiceKnownType該服務需要能夠被.NET客戶端和Flex客戶端使用。使用泛型而不是對象對.NET客戶端來說更容易,因爲我不需要進行任何投射。不幸的是,除了使用第三方體系結構來實現我的服務接口外,我似乎無法使用帶有泛型的基本接口。 – Brandon 2010-02-15 14:47:21

+0

如果你總是將.Net轉換爲.Net,那麼使用REST的好處就會減少很多 - 你可能會使用普通的舊WCF更好。 – Keith 2010-02-15 15:36:24

+0

我們實際上不知道誰將會使用我們的服務。我們知道我們正在使用.NET。NET肯定,我們的服務將託管在不同的服務器上。 – Brandon 2010-02-15 16:12:06

0

WCF不允許在其服務合同中使用開放式泛型。它提供了一個KnownType和ServiceKnownType屬性,可以讓你「通知」它的多態性。您可以爲ServiceKnownType屬性提供一個靜態幫助器方法,該方法也會返回已知類型的集合。我用它來返回匹配我的通用配置的類型。

+0

我實際上能夠得到這個工作。我所做的是將我想通過基類中的大部分邏輯移動到WCF NET TCP服務,然後設置一個RESTful端點並將其作爲我的NET TCP服務的路由器服務處理。這實現了我的目標,無需複製大量代碼。 這似乎是與WCF泛型+ RESTful Web服務的問題。 – Brandon 2010-04-21 13:05:32