WebApi - 请求的资源不支持http方法' GET'

时间:2015-07-18 23:06:01

标签: c# asp.net-mvc-4 azure asp.net-web-api

问题背景:

我有一个基本的WebApi项目,在Azure中作为WebApp托管。

问题:

我遇到的问题是如果我访问除了' GET'以外的任何方法。输入然后我在我的JSON响应中收到以下错误:

The requested resource does not support http method 'GET'

守则:

以下代码是该项目目前的情况。

RouteConfig.cs上课:

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


        routes.MapRoute(
            name: "Home",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

ValuesController控制器类:

public class ValuesController : ApiController
{

    private List<CompanyData> _company;

    public ValuesController()
    {
        _company = new List<CompanyData>
        {
            new CompanyData
            {
                CompanyName = "SmallTech.Ltd",
                CompanyOwner = "John Smith",
                CompanyIndustry = "Electronic Components",
                EmployeeNo = "3"
            }

        };
    }

    public List<CompanyData> GetCompanyData()
    {
        return _company;
    }


     //GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "Test GET Method"};
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post(string value)
    {
        string test = value;
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete]
    public void Delete(int id)
    {
    }

发生错误时调用上述Delete方法的示例是:

http://testwebapisite.azurewebsites.net/api/values/Delete/5

我已阅读其他人遇到相同问题并使用System.Net.MVC中的HTTP属性。我可以确认我没有使用它并使用`System.Net.Http.HttpPostAttribute。

任何有关我收到GET错误消息的原因的帮助都很棒。

2 个答案:

答案 0 :(得分:3)

您正尝试通过GET请求访问明确指定删除为动词的操作。

默认情况下,如果您粘贴网址,浏览器会执行GET请求,这样很容易测试,但对于其他动词,您必须使用实际的rest / http客户端来指定动词。如果使用chrome to dev / test

,则可以使用Postman或Rest Console

除了这些工具之外,您可能还希望安装fiddler ..它可以帮助您跟踪所有http活动(已发送/已接收),您将确切知道您发送和接收的内容电线

如果您想使用HttpClient,也可以从代码执行此操作。

using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://testwebapisite.azurewebsites.net/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


                   HttpResponseMessage response = await client.DeleteAsync("api/values/5");
                }

答案 1 :(得分:2)

您尚未显示用于调用API的代码,但我怀疑您没有使用DELETE HTTP谓词。您正在访问的资源具有URI或http://testwebapisite.azurewebsites.net/api/values/5 - 请注意,未指定操作名称。相反,正如您的方法的注释所暗示的那样,您应该使用DELETE HTTP动词。例如:

using (var client = new HttpClient())
    await client.DeleteAsync("http://testwebapisite.azurewebsites.net/api/values/5");