我一直在努力让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。
感谢您的帮助。这么简单,没有任何工作。
答案 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>