Web API 2无法正常工作(404)

时间:2014-07-25 10:59:24

标签: c# asp.net-web-api asp.net-web-api-routing

我一直在努力让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。

感谢您的帮助。这么简单,没有任何工作。

3 个答案:

答案 0 :(得分:23)

请像这里更新你的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")]

答案 1 :(得分:1)

对我来说,路由属性不适用于WebAPI,因为我在web.config中安装了URL Rewrite模块。不知何故,全局路由模板正在使用它,但不是每个Web方法上面的路由属性。我从web.config中的<rewrite>部分删除了<system.webServer>部分,路由属性开始工作。

答案 2 :(得分:0)

以我为例,我有一个Web API 2项目,该项目正在域名的子文件夹中发布,该文件夹托管了自己的ASP.net项目。来自该主应用程序的web.config被继承到Web API 2项目的web.config中,这会干扰路由。为了解决这个问题,我在主项目中stopped web.config inheritance completely

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