it-swarm.com.ru

Web API - 405 - запрашиваемый ресурс не поддерживает http-метод "PUT"

У меня есть проект Web API, и я не могу включить запросы «PUT/Patch» на него.

Ответ, который я получаю от скрипача:


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'."}

На основании приведенного выше ответа глаголы "PUT" не принимаются. Однако я не могу понять, где настроен соответствующий обработчик.

Метод «Put» класса объявлен следующим образом:

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

Я прочитал и внедрил изменения, описанные в следующих потоках: - Asp.NET Web API - 405 - HTTP-глагол, используемый для доступа к этой странице, не разрешен - как установить сопоставления обработчиков - http://www.asp.net/web-api/overview/testing-and-debugging/trou устранение неполадок-http-405-errors-after-publishing-web-api-applications

Ничего не помогло, так как я все еще получаю ответ 405, когда пытаюсь выполнить команду "PUT" для моего проекта Web API.

Я даже закомментировал все «обработчики» в файле ApplicationsHost.config.

Работа с VS2012 Premium и IIS Express (я предполагаю, что это версия 8). Я также попробовал VS Dev Server, но это дало мне тот же результат.

У меня нет идей. Любая помощь будет оценена.

Спасибо ли

18
LeeVDuhl

Вы используете атрибут маршрутизации?

Эта мистическая ошибка была проблемой route attribute. Это включено в вашем WebAPIConfig как:

 config.MapHttpAttributeRoutes(); 

Оказывается, контроллеры Web Api «не могут размещать смесь методов действий на основе глаголов и традиционной маршрутизации имен действий»; https://aspnetwebstack.codeplex.com/workitem/184

в двух словах: Мне нужно было пометить все мои действия в контроллере API с помощью атрибута [Route], в противном случае действие «скрыто» (405) при попытке найти его с помощью традиционной маршрутизации.

Контроллер API:

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

примечание: мой маршрут не назван, поэтому имя CreatedAtRoute () - просто пустая строка.

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

    }
}

надеюсь это поможет 

22
proggrock

У меня была та же проблема, что и у вас, и я пробовал все, что вы пробовали, но иногда решение оказывается настолько тривиальным и у вас под носом, что вы просто не ожидаете этого и продолжаете искать более сложные причины. Убедитесь, что в URL, который вы вызываете для тестирования своих веб-методов, имена параметров совпадают с именами в объявлении метода вашего контроллера. Моя проблема 405 была решена просто путем этого (я использовал параметры запроса):

Мои клиентыКонтроллер:

...

[HttpPut]
public string PutClient(string username = "", string phone= ""){...}

На моем WebApiConfig:

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}"
);

И путь, используемый для проверки метода, должен быть таким: (используйте Postman или аналогичный, чтобы применить правильный веб-метод)

http://localhost:49216/api/clients?username=Kurt&phone=443332211

В противном случае вы получите 405 для этого метода http в этом контроллере. Мне вообще не нужно было менять web.config (не нужно удалять webdav и т.д.). Проверьте это для источника в документации: 

Например, рассмотрим следующее действие:

public void Get (int id) 

Параметр id привязывается к URI. Следовательно, это действие может соответствовать только URI, который содержит значение для "id", либо в словаре маршрутов, либо в строке запроса.

Необязательные параметры являются исключением, поскольку они являются необязательными. За необязательный параметр, это нормально, если привязка не может получить значение из URI.

8
kurt

Это случилось со мной, когда я изменил имя первого параметра метода PUT

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

Так должно быть:

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

И вот как это называется:

$.ajax({
    type: "PUT",
    data: json,
    url: "../api/leadsapi/123",
    contentType: "application/json; charset=utf-8"
});
2
Daniel Cardenas

Этот ответ решил проблему для меня. Мне пришлось добавить атрибут Route, и проблема была решена. 

    [HttpPut]
    [Route("")]
    public HttpResponseMessage MyMethod()
1
Dave Storm

была та же проблема, мне нужно было сделать 3 вещи, чтобы решить эту проблему:

  1. отключить Webdav в <modules> и <handlers>
  2. Убедитесь, что HttpPut из System.Web.Http, а не из System.Web.Mvc при использовании WebAPI
  3. включите ExtensionlessUrlHandler, как это

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

<remove name="ExtensionlessUrlHandler-Integrated-4.0" />

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />

<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Надеюсь, что это поможет некоторым из вас решить эту неприятную проблему ...

1
Ben Croughs

Это также сообщение об ошибке, возвращаемое, если вы забыли сделать метод Put () на вашем контроллере API общедоступным. Что задним числом очевидно, но вызвало у меня добрых десять минут головокружения.

1
Dylan Beattie

Добавьте следующий раздел в раздел «Обработчик» в файле web.config:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Например:

<handlers>
    <remove name="WebDAV" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="OPTIONSVerbHandler" />
    <remove name="TRACEVerbHandler" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
0
Sulabh Singla

Может быть, уже поздно, но кто-то может использовать это.

Я хотел использовать запрос PUT, и я только что отправил строковый объект в web api, а метод put только принял этот объект.

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)
0
Serlok

Вы должны настроить его в конфигурации вашего веб-сервера. Это зависит от типа веб-сервера, где вы можете это сделать. Например, IIS, вы можете использовать файл web.config для этого в корне вашего документа. При запросах между источниками вы должны добавить заголовки CORS к ответу, чтобы разрешить источники, методы и т.д.

примечание: Вероятно, вы можете сделать что-то об этом с помощью ASP.NET Framework, но я думаю, что это не так.

0
inf3rno