简体   繁体   中英

WebApi - The requested resource does not support http method 'GET'

Question Background:

I have a basic WebApi project hosted as a WebApp in Azure.

The Issue:

The problem I have is If I access any method other than a 'GET' type then I'm receiving the following error in my JSON response:

The requested resource does not support http method 'GET'

The Code:

The following code is how the project currently is.

RouteConfig.cs class:

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

The ValuesController controller class:

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)
    {
    }

An example of calling the above Delete method when the error occurs is:

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

I have read other people having the same issue and using the HTTP attributes from the System.Net.MVC . I can confirm I'm not using this and am using `System.Net.Http.HttpPostAttribute.

Any help working out why I'm receiving the GET error message would be great.

You are trying to access an action which clearly specifies delete as its verb via a GET request.

By default the browser will do a GET request if you paste a url so thats pretty much easy to test but for the other verbs you'll have to use an actual rest/http client to specify the verb. You can use Postman or Rest Console if you use chrome to dev/test

In addition to those tools, you might want to have fiddler installed .. it will help you track all http activity (both sent/received) you'll know exactly what you are sending and receiving from the wire

You could also do this from code if you want using 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");
                }

You haven't shown the code that you are using to invoke the API, but I suspect you are not using the DELETE HTTP verb. The resource you are accessing has URI or http://testwebapisite.azurewebsites.net/api/values/5 - note the action name is not specified. Rather, as the comment of your method suggests, you should be using the DELETE HTTP verb. Example:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM