2014-07-25 119 views
11

我一直在尝试很长一段时间才能获得Web API 2的工作。我在互联网上看了很多文章和帖子,但到目前为止我一直不走运。Web API 2不工作(404)

我只需要简单的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 +网页API 2.

感谢您的帮助。如此简单的事情,没有任何工作。

回答

20

请更新您的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")]

+3

Api路由必须首先评估,或者您需要创建更严格的mvc路由(例如,框架不会尝试查找'ApiController')。这不是MVC5特定的行为 – chemitaxis

+0

您真棒!它的工作原理,只有我不得不删除开始/从建议的路线[路线(“/ api/sendemail”)]。我会接受这个答案。 – Daniel

+0

从一个空的项目开始,我错过了FilterConfig和RouteConfig部分。基于模板添加这些类别的技巧。 – Jerther

1

对我来说,路由属性未用的WebAPI工作,因为我已经安装在我的网站URL重写模块。配置。不知何故,全局路由模板正在处理这些事情,但不是每个Web方法上面的路由属性。我从web.config的<system.webServer>部分中删除了<rewrite>部分,并且路由属性开始工作。