【问题标题】:Web API 2 not working (404)Web API 2 不工作 (404)
【发布时间】:2014-09-17 05:14:49
【问题描述】:

我一直在尝试让 Web API 2 正常工作。我在互联网上阅读了很多文章和帖子,但到目前为止我一直很不走运。

我只需要使用简单的 Web API 方法,但由于某种原因,我仍然找不到 404 方法。我现在真的不知道问题出在哪里,在我看来一切正常。

我尝试了很多属性、配置等的变体。我最终得到了这段代码:

全球.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。

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

【问题讨论】:

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


    【解决方案1】:

    在我的例子中,我有一个 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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • Api 路由必须首先评估,否则您需要创建更严格的 mvc 路由(这样框架不会尝试查找“ApiController”。)这不是 MVC5 特定的行为
        • 你太棒了!!!它有效,只有我必须从建议的路线 [Route("/api/sendemail")] 中删除开始/。我会接受这个作为答案。
        • 从一个空项目开始,我错过了 FilterConfig 和 RouteConfig 部分。根据模板添加这些类就可以了。
        • 我想补充一点,我在 404 问题上迷失了半个上午,所有的答案似乎都不适合我,因为我拥有所有需要的组件。在我的情况下,我在 webapi 路由之前注册了普通路由,这似乎覆盖了 api 路由并且无法识别它们,所以在切换两者之后它终于起作用了。
        • 路由显然不能以/ 开头。全局尝试绑定时出现错误。不知道到底发生了什么,但整个早上都在尝试解决这个问题sigh
        猜你喜欢
        • 2018-03-21
        • 2015-10-29
        • 2016-02-02
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多