2016-07-05 6 views
0

で郵便配達中に入れてメソッドを呼び出すと、私はポストマンを通じてPutメソッドを呼び出すようにしようと常にエラーを得ていた「405の方法を許可しません」 httpメソッド 'PUT'をサポートしていません。 "エラーは、身体パラメータ

私は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(); 
} 

私はポストマンは、私が "http://localhost:XXXX/multilanguage/resources/2/En" と呼ぶthrought Putメソッドを呼び出し
:ここに私のコードです。 "2"と "En"は私のコードの最初の2つのパラメータです。また、x-www-form-urlencodedタイプのPostmanリクエストBodyに "text"パラメータ値を指定します:key = text、value = Test!このputメソッドは、temp.Contentの値を "Test!"に更新することを想定しています。しかし、私は上記のエラーで常に失敗しました。

私はここで何かを見逃しましたか?

答えて

1

405エラーウェブAPIにPUT要求を行う周知の課題です。多くの解決策はthisまたはthisです。

そして、あなたの設計のためには、コントローラ:

PUTを単にPOSTのように、体を持つように設計されており、あなたのケースで あなたの代わりに体内のすべてのパラメータを送信する必要があります。

あなたがサーバーに送信したいオブジェクトを含むクラスを作成する必要があります属性はルーティングせずにルートを指定し、リクエストボディ

[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(); 
} 
からオブジェクトを取得後

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

クライアントから、このようなContent-Type application/jsonのPUTリクエストにオブジェクトを追加できます

var data = { 
    Id: clientId, 
    Language: clientLanguage, 
    text: clientText 
}; 
0 httpリクエスト

data: JSON.stringify(data), 

にそれを追加するとき

はJSONを文字列化することを忘れないでくださいPUTコントローラは、「http://localhost:XXXX/multilanguage/resources/putresource」に到達することになります。

+0

ありがとうございました!それは動作します! –

+0

素晴らしい!良い一日を –

関連する問題