Web API - 405 - The requested resource does not su

2019-01-09 06:12发布

I have a Web API project and I am unable to enable "PUT/Patch" requests against it.

The response I get from fiddler is:


HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Allow: GET,POST,DELETE
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcZG90TmV0XFdlYkFQSVxBZFNlcnZpY2VcQWRTZXJ2aWNlXGFwaVxpbXByZXNzaW9uXDE1?=
X-Powered-By: ASP.NET
Date: Tue, 06 May 2014 14:10:35 GMT
Content-Length: 72

{"message":"The requested resource does not support http method 'PUT'."}

Based on the above response, "PUT" verbs are not accepted. However, I'm unable to figure out where the related handler is configured.

The "Put" method of class is declared as follows:

[HttpPatch]
[HttpPut]
public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel)
{
     bla, bla, bla, bla
}

I have read and implemented the changes explained in the following threads: - Asp.NET Web API - 405 - HTTP verb used to access this page is not allowed - how to set handler mappings - http://www.asp.net/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

Nothing has worked as I'm still getting a 405 response when trying to issue a "PUT" command against my Web API project.

I even commented out all of the "Handlers" in the ApplicationsHost.config file.

Working with VS2012 Premium and IIS Express (I'm assuming it's version 8). I also tried the VS Dev Server but that gave me the same result also.

I'm out of ideas. Any help would be appreciated.

Thanks Lee

9条回答
我命由我不由天
2楼-- · 2019-01-09 06:49

Maybe it's late now, but someone can use this.

I wanted to use PUT request and I just sent stringified object to web api and in put method only accepted that object.

JQUERY

let musterija = {
            Name: name,
            Email: email,
            Password: password,
            Username: logUser.Username,
            Lastname: lastname,
            GenderString: gender,
            Jmbg: identification,
            PhoneNumber: phone,
        };

        $.ajax({
            method: "PUT",
            url: "/api/Musterija",
            data: JSON.stringify(musterija),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function () {
                alert("Entity updated");
                EmptyAllInputs();
                $('#divprofile').show();
                $('#divupdate').hide();
            },
            error: function (msg) {
                alert("Fail - " + msg.responseText);
            }
        });

WEB API

    [HttpPut]
    public HttpResponseMessage PutMusterija(Musterija m)
查看更多
成全新的幸福
3楼-- · 2019-01-09 06:53

Are you using attribute routing?

This mystic error was a route attributes issue. This is enabled in your WebAPIConfig as:

 config.MapHttpAttributeRoutes(); 

It turns out Web Api Controllers "cannot host a mixture of verb-based action methods and traditional action name routing. "; https://aspnetwebstack.codeplex.com/workitem/184

in a nutshell: I needed to mark all of my actions in my API Controller with the [Route] attribute, otherwise the action is "hidden" (405'd) when trying to locate it through traditional routing.

API Controller:

[RoutePrefix("api/quotes")]
public class QuotesController : ApiController
{
    ...

    // POST api/Quote
    [ResponseType(typeof(Quote))]
    [Route]
    public IHttpActionResult PostQuote(Quote quote)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Quotes.Add(quote);
        db.SaveChanges();

        return CreatedAtRoute("", new { id = quote.QuoteId }, quote);
    }

note: my Route is unnamed so the CreatedAtRoute() name is just an empty string.

WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

    }
}

hope this helps

查看更多
萌系小妹纸
4楼-- · 2019-01-09 06:53

This happened to me when I changed the first parameter name of the PUT method

public void Put(int code, [FromBody]Lead lead)

It should be:

public void Put(int id, [FromBody]Lead lead)

And this is how it gets called:

$.ajax({
    type: "PUT",
    data: json,
    url: "../api/leadsapi/123",
    contentType: "application/json; charset=utf-8"
});
查看更多
登录 后发表回答