首页 新闻 会员 周边 捐助

Response status code does not indicate success: 405 (Method Not Allowed).

0
悬赏园豆:30 [已解决问题] 解决于 2014-09-24 13:49

学习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配置,仍然不起作用,请问该怎么解决?

日暮乡关何处是的主页 日暮乡关何处是 | 初学一级 | 园豆:84
提问于:2014-08-08 06:46
< >
分享
最佳答案
1

你这个问题看起来有点可怜,我看了你提供的连接,事实上,在我的电脑上,IISEXPRESS的配置里是没有PUT和DELETE谓词的,但我的VS在使用IISEXPRESS调试WEBAPI的时候,是能正确的使用PUT和DELETE谓词。

你或者,直接在你的方法里通过HTTPVERB特性定义为PUT或DELETE看?这个是WEBAPI的一个扩展,通过这个定义,可以扩展无限的谓词。

收获园豆:25
519740105 | 大侠五级 |园豆:5810 | 2014-08-08 08:41

我试了一下,还是不行。

[AcceptVerbs("PUT")]
// PUT api/products/5
public void Put(int id, [FromBody]Product item)
{

}

我设断点试了一下,请求到不了这个方法。

日暮乡关何处是 | 园豆:84 (初学一级) | 2014-08-08 13:00

@暗夜娜姐: 这个很难厘清你的问题具体所在了。

 

按照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 | 园豆:5810 (大侠五级) | 2014-08-08 15:04

@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);
}
}

日暮乡关何处是 | 园豆:84 (初学一级) | 2014-08-08 15:59

@暗夜娜姐: 还是C/S架构啊?这个,我好久没弄C/S了,更没在C/S下弄过WebApi。

你可以这样:

1、写一个Web应用,测试你的WebApi是否OK,如果这里也不行,那可能是你的WebApi的问题导致的。

2、对Winform执行WebApi调用的时候,跟踪数据信息看,比如使用Fiddler2、minisniffer等工具。

519740105 | 园豆:5810 (大侠五级) | 2014-08-08 16:18

@519740105: 你说的有道理,我试一下

日暮乡关何处是 | 园豆:84 (初学一级) | 2014-08-08 16:19
其他回答(1)
0

看看你的路由和加上[HttpPost]试试

收获园豆:5
Yu | 园豆:12990 (专家六级) | 2014-08-08 09:46

Post是可以的,我想用的是PUT和DELETE

支持(0) 反对(0) 日暮乡关何处是 | 园豆:84 (初学一级) | 2014-08-08 13:01

@暗夜娜姐: 

<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
</configuration>

 在你的app.config上加上这个试试

支持(0) 反对(0) Yu | 园豆:12990 (专家六级) | 2014-08-08 17:03

@Yu: 这个试过了呀

支持(0) 反对(0) 日暮乡关何处是 | 园豆:84 (初学一级) | 2014-08-11 14:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册