2016-07-05 25 views
0

我試圖通過郵遞員調用Put方法並始終出錯:
「405方法不允許」和「消息」:「請求的資源不支持http方法'PUT'。「錯誤「405方法不允許」在郵遞員中調用Put方法時使用body參數

我正在使用DocumentDB和C#。這裏是我的代碼:

[Route("multilanguage/Resources/{id}/{Language}")] 
[HttpPut] 
public async Task<IHttpActionResult> UpdateResource(string Id, string Language, string text) 
{ 
    client = new DocumentClient(new Uri(EndPoint), AuthKey); 
    var collectionLink = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId); 

    var query = new SqlQuerySpec("SELECT * FROM MultiLanguage as m where m.id = @pmId", 
    new SqlParameterCollection(new SqlParameter[] { new SqlParameter { Name = "@pmId", Value = Id } })); 

    Document doc = client.CreateDocumentQuery<Document>(
      collectionLink, query).AsEnumerable().FirstOrDefault(); 

    List<Models.Translations> d = doc.GetPropertyValue<List<Models.Translations>>("Translations"); 
    Models.Translations temp = d.Find(p => p.Language == Language); 

    temp.Content = text; 
    temp.LastModified = DateTimeOffset.Now; 
    temp.ModifiedBy = "admin"; 
    doc.SetPropertyValue("Translations", d); 

    Document updated = await client.ReplaceDocumentAsync(doc); 

    return Ok(); 
} 

當我調用Put方法throught郵差,我稱之爲 「http://localhost:XXXX/multilanguage/resources/2/En」。 「2」和「En」是我的代碼中的前兩個參數。我還使用x-www-form-urlencoded類型在郵遞員請求正文中指定「文本」參數值:key = text,value = Test!這個put方法假設將temp.Content值更新爲「Test!」。但是,它總是因我上面提到的錯誤而失敗。

我在這裏錯過了什麼嗎?

回答

1

向web api執行PUT請求時出現405錯誤是一個衆所周知的話題。您可以在thisthis SO問題中找到許多解決方案。

併爲您控制器的設計:

PUT被設計爲有身體,就像郵政與你的情況 你應該在身體發出的所有參數來代替。

你應該創建一個包含要發送到服務器的對象類:

public class resourceClass 
{ 
    public string Id { get; set; } 
    public string Language { get; set; } 
    public string text { get; set; } 
} 

然後指定無屬性的路由的路由和請求主體獲取對象

[Route("multilanguage/Resources/PutResource")] 
[HttpPut] 
public async Task<IHttpActionResult> UpdateResource([FromBody] resourceClass obj) 
{ 
    client = new DocumentClient(new Uri(EndPoint), AuthKey); 
    var collectionLink = UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId); 

    var query = new SqlQuerySpec("SELECT * FROM MultiLanguage as m where m.id = @pmId", 
    new SqlParameterCollection(new SqlParameter[] { new SqlParameter { Name = "@pmId", Value = Id } })); 

    Document doc = client.CreateDocumentQuery<Document>(
      collectionLink, query).AsEnumerable().FirstOrDefault(); 

    List<Models.Translations> d = doc.GetPropertyValue<List<Models.Translations>>("Translations"); 
    Models.Translations temp = d.Find(p => p.Language == Language); 

    temp.Content = text; 
    temp.LastModified = DateTimeOffset.Now; 
    temp.ModifiedBy = "admin"; 
    doc.SetPropertyValue("Translations", d); 

    Document updated = await client.ReplaceDocumentAsync(doc); 

    return Ok(); 
} 

從客戶端可以添加一個對象到Content-Type應用/ json的PUT請求中,像這樣

var data = { 
    Id: clientId, 
    Language: clientLanguage, 
    text: clientText 
}; 

不要忘了將它添加到HTTP請求

data: JSON.stringify(data), 

的PUT控制器,然後在「http://localhost:XXXX/multilanguage/resources/putresource」到達時,該字符串化JSON。

+0

謝謝!這樣可行! –

+0

太棒了!祝你今天愉快 –