嘿,我在客户端REST应用程序中更新数据时遇到了很大麻烦。
我制作了一个Web API控制器。
// PUT: api/Contacts/5
[ResponseType(typeof(void))]
public IHttpActionResult PutContact(Contact contact, int id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != contact.ContactId)
{
return BadRequest();
}
_contactService.Update(contact);
return StatusCode(HttpStatusCode.NoContent);
}
还有客户端服务方法:
public async Task<T> PutData<T>(T data, int dataId)
{
HttpResponseMessage resp = await this._client.PutAsJsonAsync(_serviceUrl + "/" + dataId, data);
resp.EnsureSuccessStatusCode();
return await resp.Content.ReadAsAsync<T>();
}
服务URL在调试模式下显示我转到端点: http://localhost:21855/api/Contacts/8
但是当我调试我的服务器控制器PutContact方法时,它甚至没有进入断点。
我做错了什么?我需要更新数据,但我不能,因为我的客户端应用程序甚至不会在调试模式下转到服务器断点! 它给我一个错误响应405:方法不允许
答案 0 :(得分:0)
您可以在同一方法中使用两个不同的身体参数。
您需要做的是将id
参数设置为来自URI和来自正文的Contact
参数,如下所示:
public IHttpActionResult PutContact([FromBody]Contact contact, [FromUri]int id)
{
// method code
}
BTW,我想你的控制器中有一个GET方法,如下所示:
public IHttpActionResult GetContact(int id)
{
// method code
return Contact; // pseudo-code
}
你得到的错误来自这样一个事实:系统并没有真正调用你的PUT方法而是GET方法(由于我之前表达的原因,系统忽略了Contact
参数):调用GET方法PUT动词会导致405 Method Not Allowed
异常。