Web API 2 не работает (404)

Я давно пытаюсь работать с Web API 2. Я прочитал много статей и сообщений через Интернет, но до сих пор мне не повезло.

Мне просто нужно получить простой простой метод Web API, но по какой-то причине я все еще получаю 404 метод не найден. Я действительно не знаю сейчас, где проблема может быть, как мне кажется, все в порядке.

Я пробовал множество вариаций атрибутов, конфигов и т.д. Я получил код:

Global.asax

AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);

GlobalConfiguration.Configure(WebApiConfig.Register);

WebApiConfig.cs

config.MapHttpAttributeRoutes();

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

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(x => x.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

ApiController

public class ContactFormController : ApiController
{
    [Route("~/api/sendemail")]
    [HttpPost()]
    public IHttpActionResult SendEmail(ContactFormModel contactForm)
    {
        return Ok();
    }
}

Модель:

public class ContactFormModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
}

Код jQuery

var jsonData = { "Name": name.val(), "Email": email.val(), "Subject": subject.val(), "Message": comment.val() };

$.ajax({
    url: "api/sendemail",
    type: "POST",
    data: jsonData,
    cache: false,

    ...
});

Как вы можете видеть, это MVC 5 + Web API 2.

Спасибо за помощь. Так просто и ничего не работает.

Ответ 1

обновите свой global.asax, как здесь:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);

}

и измените [Route("~/api/sendemail")] на [Route("/api/sendemail")]

Ответ 2

Для меня атрибуты маршрутизации не работали с WebAPI, потому что в моем файле web.config был установлен модуль перезаписи URL. Каким-то образом глобальные шаблоны маршрутизации работали с этим на месте, но не с атрибутами маршрутизации над каждым веб-методом. Я удалил раздел <rewrite> из раздела <system.webServer> в web.config, и атрибуты маршрутизации начали работать.

Ответ 3

В моем случае у меня был проект Web API 2, который публиковался в подпапке доменного имени, где размещался собственный проект ASP.net. Файл web.config из этого основного приложения был унаследован в файле web.config проекта Web API 2, который мешал маршрутизации. Чтобы решить эту проблему, я полностью прекратил наследование web.config в основном проекте.

  <location path="." inheritInChildApplications="false"> 
    <system.web> 
    … 
    </system.web> 
  </location>