2014-08-28 11 views
1

我有以下代碼。是否可能或有必要設置ServiceStack客戶端刪除請求的內容類型?

public T SendUpdateRequest(string url) 
{ 
    using (JsonServiceClient client = new JsonServiceClient()) 
    { 
     T response = client.Put<T>(url); 
     return response; 
    } 
} 

我有創建和刪除請求,調用JsonServiceClient分別PostDelete方法類似的方法。

當調用我的更新或創建方法時,對外部API的調用工作正常。刪除不。我可以看到,如果通過REST console向其發出請求,API的刪除方法確實有效。

當我比較我的非工作刪除與Fiddler中工作人員的請求/響應時,我可以看到主要區別是我的請求沒有將content-type設置爲application/json(所有這些方法都返回JSON)。

我的問題是,是否有可能(甚至有必要)將我的刪除請求的content-type明確設置爲application/json以成功調用我的API方法?

+2

作爲一個方面說明。因爲客戶端是cookie的容器,所以請注意爲每個請求使用「新的JsonServiceClient()」,因此如果您在一個客戶端中接收到會話cookie,則其他實例不可用。最好創建客戶端的一個實例,並在請求中共享它。 – Scott 2014-08-28 07:12:30

+1

'Content-Type'HTTP Header用於標識HTTP Request BODY所處的格式。由於HTTP GET和DELETE請求沒有Request Body,因此不會按預期方式添加Content-Type。你可能正在尋找'Accept'頭,它表示客戶端希望響應體的格式是什麼,在ServiceStack的'JsonServiceClient'中總是'application/json'。 – mythz 2014-08-28 15:38:41

+0

優秀的建議,謝謝你們兩位。 – 2014-08-28 22:05:31

回答

3

由於content-type僅適用於主體,因此ServiceStack客戶端不會在請求中設置content-type標頭,因爲它是沒有請求主體的,因此是冗餘的。

這個can be seen here在準備客戶端請求的代碼中。

if (httpMethod.HasRequestBody()) 
{ 
    client.ContentType = ContentType; 
    ... 

甲正確實現RESTful服務應該是滿意的DELETE請求而不被指定content-type那裏沒有體。

DELETE /User/123 HTTP/1.1 

如果您呼叫的服務不滿意沒有這種類型被指定你的要求(這是不尋常),這時你可以手動強制使用此過濾器的類型的發送:

var client = new JsonServiceClient("https://service/"); 
client.RequestFilter += (httpReq) => { 
    // Force content type to be sent on all requests 
    httpReq.ContentType = "application/json"; 
}; 

我希望有幫助。

+0

你完全正確的斯科特。看起來我打電話的服務不會在沒有明確指定的情況下打球(考慮到我看到的其他陷阱,這並不令人驚訝)。無論如何,你的底部代碼塊做了訣竅 - 謝謝。 – 2014-08-28 22:10:28

相關問題