错误" 405方法不允许"使用body参数在Postman中调用Put方法时

时间:2016-07-05 15:20:03

标签: c# http asp.net-web-api2 postman

我试图通过Postman调用Put方法并且总是收到错误:
" 405 Method Not Allow"和"消息":"请求的资源不支持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();
}

当我通过Postman调用Put方法时,我会调用&#34; http://localhost:XXXX/multilanguage/resources/2/En&#34;。 &#34; 2&#34;和&#34;恩&#34;是我的代码中的前两个参数。我还指定了&#34;文本&#34; Postman请求Body中的参数值x-www-form-urlencoded类型:key = text,value = Test!这个put方法假设将temp.Content值更新为&#34; Test!&#34;。但是,它始终因上面提到的错误而失败。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

对web api执行PUT请求时出现405错误是一个众所周知的主题。您可以在thisthis SO问题中找到许多解决方案。

对于你的设计控制器:

PUT的设计就像POST一样,就像你的情况一样 你应该发送身体中的所有参数。

您应该创建一个包含要发送到服务器的对象的类:

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 application / json的PUT请求

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

将json添加到http请求时,不要忘记对其进行字符串化

data: JSON.stringify(data),

然后将在“http://localhost:XXXX/multilanguage/resources/putresource”处到达PUT控制器。