学习web api2时,put和delete的方法执行时,报:Response status code does not indicate success: 405 (Method Not Allowed).
根据 http://www.dotblogs.com.tw/joysdw12/archive/2014/01/07/asp-net-handler-ashx-iis-express-http-put-delete-405.aspx 的说法,修改了IIS Express的config配置,仍然不起作用,请问该怎么解决?
你这个问题看起来有点可怜,我看了你提供的连接,事实上,在我的电脑上,IISEXPRESS的配置里是没有PUT和DELETE谓词的,但我的VS在使用IISEXPRESS调试WEBAPI的时候,是能正确的使用PUT和DELETE谓词。
你或者,直接在你的方法里通过HTTPVERB特性定义为PUT或DELETE看?这个是WEBAPI的一个扩展,通过这个定义,可以扩展无限的谓词。
我试了一下,还是不行。
[AcceptVerbs("PUT")]
// PUT api/products/5
public void Put(int id, [FromBody]Product item)
{
}
我设断点试了一下,请求到不了这个方法。
@暗夜娜姐: 这个很难厘清你的问题具体所在了。
按照PUT方法所描写,你的请求地址应该带ID,如你描写:api/products/5
你的数据的提交,frombody是说这个对象的内容来之body,而不使用url的参数构造product对象。
在put调用的时候,常用的有三个方案:xml、json、webform。不知道你使用的是哪个方案。基于xml的,我没有做过。
基于WEBFORM:你应该象表单提交那样编写数据就好。
基于json:json数据应该是 { item = {} } 这样的格式。
另外,在不同的数据提交方式里,要在contentType里有明确的描述,如:application/json、application/xml、application/form(这个表单方式的具体拼写忘记了,你修正下。)
@519740105:
服务器端:
[AcceptVerbs("PUT")]
// PUT api/products/5
public void Put(int id, [FromBody]Product item)
{
repository.Update(item);
}
[AcceptVerbs("DELETE")]
// DELETE api/products/5
public void Delete(int id)
{
Product item = repository.Get(id);
repository.Remove(id);
}
客户端:
static void Put(HttpClient client, Product newProduct)
{
try
{
HttpResponseMessage response = client.PutAsJsonAsync("api/products"+newProduct.Id.ToString(), newProduct).Result;
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException e)
{
Console.WriteLine(e.Message);
}
}
static void Delete(HttpClient client, int id)
{
try
{
HttpResponseMessage response = client.DeleteAsync("api/products").Result;
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException e)
{
Console.WriteLine(e.Message);
}
}
@暗夜娜姐: 还是C/S架构啊?这个,我好久没弄C/S了,更没在C/S下弄过WebApi。
你可以这样:
1、写一个Web应用,测试你的WebApi是否OK,如果这里也不行,那可能是你的WebApi的问题导致的。
2、对Winform执行WebApi调用的时候,跟踪数据信息看,比如使用Fiddler2、minisniffer等工具。
@519740105: 你说的有道理,我试一下
看看你的路由和加上[HttpPost]试试
Post是可以的,我想用的是PUT和DELETE
@暗夜娜姐:
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
</configuration>
在你的app.config上加上这个试试
@Yu: 这个试过了呀