2017-03-21 43 views
1

我在.Net項目中使用最新的ServiceStack客戶端庫,並且在發出PUT請求時遇到了一些問題。 特別是它似乎沒有考慮到RequestDto對象中定義的參數類型,並將所有參數放在body中(儘管param被定義爲type =「query」)。ServiceStack客戶端放置請求和查詢參數

我的Request對象(產生自動)看起來是這樣的:

[Route("/test/name", "PUT")] 
public partial class PutTestName 
: IReturn<PutTestNameResponse> 
{ 
    ///<summary> 
    ///the user id 
    ///</summary> 
    [ApiMember(Description = "the user id", ParameterType = "query")] 
    public virtual string UserId { get; set; } 

    ///<summary> 
    ///the name 
    ///</summary> 
    [ApiMember(Description = "the name", ParameterType = "query")] 
    public virtual string Name { get; set; } 

} 

我作出這樣的呼籲:

_apiClient.Put(new PutTestName(){UserId ="xyz..", Name="Bob"}); 

,我得到的回報 「找不到資源」 異常。

當我使用Postman手動運行查詢(並將兩個參數都放在Querystring中)時,它工作正常。

當使用fiddler調試C#客戶端時,我可以看到沒有參數設置爲查詢字符串,並且它們都在主體中傳遞。

編輯:這是什麼提琴手請求原始的樣子:

PUT https://xxxx/test/name HTTP/1.1 
User-Agent: ServiceStack .NET Client 4.56 
Accept-Encoding: gzip,deflate 
Ocp-Apim-Subscription-Key: 783.... 
Content-Encoding: gzip 
Accept: application/json 
Content-Type: application/json 
Host: xxx.net 
Content-Length: 115 
Expect: 100-continue 
Connection: Keep-Alive 

{"UserId":"xxx","Name":"Bob"} 

還有就是ServiceStack API和我的通話之間Azure的API管理,但我不認爲這是問題。客戶端代碼正在設置參數,而它們應該在查詢中。

回答

2

如果相同的請求與POST作品則很可能是WebDAV是啓用,並與您PUT請求在這種情況下,你應該disable WebDav因此請求能達到ServiceStack暢通干擾。

爲了調試這樣的HTTP互操作性問題,您應該使用Fiddler,Chrome Web Inspector或WireShark等工具檢查(並在此提供)原始HTTP響應頭。如果HTTP響應頭中沒有包含X-Powered-By: ServiceStack..標題,則可能是請求在到達ServiceStack之前被攔截並阻止,例如, IIS/ASP.NET或轉發代理。

客戶端代碼正在設置身體中的參數,而他們的 應該在查詢中。

ServiceStack只發送參數在體內不具有請求主體像GETDELETE,用於動詞與請求機構HTTP動詞,例如POSTPUT ServiceStack的JsonServiceClient將按預期發佈POST JSON。

ServiceStack服務將接受發佈在QueryString,JSON請求正文或x-www-form-urlencoded Content-Type中的參數。如果你是不打電話給ServiceStack服務你應該是using a generic HTTP ClientHTTP Utils這將允許你控制exactly how the Request is sent,例如,G:

var response = absoluteUrl.ToPutUrl(new PutTestName {...}); 

將發送結果X WWW的窗體-urlencoded

ServiceStack's .NET Service Clients僅用於向ServiceStack服務發送請求。

+0

@Etienne您只添加了HTTP請求頭,HTTP響應頭是什麼樣的? – mythz

+0

我不認爲這很重要,如果我使用PostMan進行相同的請求並將param放在查詢中,我會得到正確的結果。 如果我把它們放在身體中,我會得到404. 我是否錯過了什麼? – Etienne

+0

@Etienne如果這不是ServiceStack服務,那麼您不應該使用ServiceStack的'JsonServiceClient'。您可以使用通用的HTTP客戶端,如[HTTP Utils](http://docs.servicestack.net/http-utils#posting-data)。 – mythz