WebAPI 的 404 错误 - 在 HttpModule 中注册路由不起作用

404 Errors for WebAPI - Registering routes in HttpModule not working

我正在尝试将 WebAPI 端点添加到现有表单应用程序,但出现 404 错误。

我无法使用 Global.asax Application_Start() 来注册 Microsoft here 建议的 api 路由,因为当前应用程序已经编译了全局 class 继承自 HttpApplication 并且他们没有将任何方法标记为 virtual。喔!

我正在尝试使用 HttpModule 加载路由。我收到以下 URL 的 404 错误: https://example.com/webapplication/myapi/Authorize/User

模块代码:

using System;
using System.Web;
using System.Web.Http;

public class MyHttpModule : IHttpModule
{
    private static bool HasAppStarted = false;
    private readonly static object _syncObject = new object();

    public void Init(HttpApplication context)
    {
        //
        if (!HasAppStarted)
        {
            lock (_syncObject)
            {
                if (!HasAppStarted)
                {
                    GlobalConfiguration.Configure(config => RegisterRoutes.Load(config));
                    HasAppStarted = true;
                }
            }
        }
    }

    #region IDisposable Implementation
    #endregion
}

我的注册class在独立库中:

using System.Web.Http;

public static class RegisterRoutes
{
    public static void Load(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute("DefaultApi", "myapi/{controller}");
    }
}

我的控制器:

using System;
using System.Web.Http;
using MyLibrary.Models;

[Route("myapi/[controller]/[action]")]
public class AuthorizeController : ApiController
{
    [HttpGet, ActionName("User")]
    [AllowAnonymous]
    public WebUser GetUser()
    {
        WebUser user = new WebUser();
        user.Key = Guid.Empty.ToString();
        return user;
    }
}

最后 web.config:

<configuration>
  <!--...-->
  <system.webServer>
    <!--...-->
    <modules>
      <add name="MyModule" type="MyLibrary.MyHttpModule" />
    </modules>
    <!--...-->
  </system.webServer>
  <!--...-->
<configuration>

webapplication 是它自己的 IIS 应用程序(它自己的 Global.asax 和 web.config)。我在 Windows 10,CLR 版本 v4.0,Managed Pipeline 已集成。

我已经尝试了 here, here, and here 描述的其他几个选项,但除了 404s 什么都没有。

TIA!

原来问题出在 MapHttpRoute() 方法调用中。路由似乎不喜欢 not 具有 defaultsconstraints 参数的值。我将地图调用更新为:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: Constants.ApiBaseRoute + "/{controller}/{action}",
    defaults: new {  }, 
    constraints: new {  }
);

我还必须添加 action 模板参数。我删除了控制器上的路由属性。

您正在混淆框架。 [Route("myapi/[controller]/[action]")] 用于 while your code appears to be for

一些建议的更改。

模块代码可以简化

GlobalConfiguration.Configure(RegisterRoutes.Load);

由于配置了属性路由

 config.MapHttpAttributeRoutes();

APIController 和操作

上使用正确的属性
[RoutePrefix("myapi/Authorize")]
public class AuthorizeController : ApiController {
    [HttpGet, ActionName("User")]
    [Route("user")] //GET myapi/authorize/user
    [AllowAnonymous]
    public IHttpActionResult GetUser() {
        WebUser user = new WebUser();
        user.Key = Guid.Empty.ToString();
        return Ok(user);
    }
}