2011-11-05 22 views
0

我創建了一個WCF服務,它返回一些數據並允許發佈一些數據。 服務的方法如下:如何定義屬性以將數據上傳到通過WCF服務實現的REST Web服務?

[OperationContract] 
    bool UploadStream(Guid key, List<StreamRecord> values); 

    [OperationContract] 
    bool RegisterStream(Guid key); 

    [OperationContract] 
    StreamCollection GetStreams(Guid key); 

我需要一個REST接口來實現這一點。 我創建了一個新的接口,IRestService如下

[WebInvoke(
     Method = "GET", 
     ResponseFormat = WebMessageFormat.Xml, 
     UriTemplate = "/bitpool/{poolKey}/streams")] 
    BitStreamCollection GetBitStreams(string poolKey); 

,它工作正常(我可以在瀏覽器地址欄中測試它所有的罰款)

現在我想也實現上傳方法,但我不知道該怎麼辦呢 我試着用

[WebInvoke(
     Method = "POST", 
     RequestFormat = WebMessageFormat.Xml, 
     ResponseFormat = WebMessageFormat.Xml, 
     UriTemplate = "/stream/{streamKey}/records/{values}")] 
    bool UploadStream(string streamKey, List<StreamRecordEntity> values); 

但是,當我嘗試訪問瀏覽器服務提示錯誤

http://localhost:6767/RestServer.svc/ 

它給出了一個錯誤:在合同

操作'UploadBitStream「IRestServerJson」有一個名爲「價值」不具有類型「字符串」路徑變量。 UriTemplate路徑段的變量必須具有「字符串」類型。

我認爲對於POST我不能定義這樣的URL,但我該怎麼做呢?

此外,方法RegisterStream應檢查是否存在與鍵的流,如果不存在,創建它並返回true,否則返回false。

我應該將它定義爲GET(因爲它必須返回結果)還是PUT或POST?

感謝

回答

1

傳遞valuesPOST請求的主體,在XML格式的,而不是在URL。一個簡單的方法來測試這是使用Fiddler

關於RegisterStreamPOSTPUT都可以在響應主體中返回信息。你可以使用POST並根據服務器所採取的行動適當的HTTP狀態代碼返回:201 Created如果創建資源,如果資源已經存在一個不同的狀態代碼是有道理的在應用程序中。

主叫方可以決定資源是否被創建或已經存在基於HTTP狀態代碼返回,這樣就不再需要了bool返回值。

附註:您可以使用[WebGet(...)]而不是[WebInvoke(Method = "GET"...)]