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 具有 defaults
和 constraints
参数的值。我将地图调用更新为:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: Constants.ApiBaseRoute + "/{controller}/{action}",
defaults: new { },
constraints: new { }
);
我还必须添加 action
模板参数。我删除了控制器上的路由属性。
您正在混淆框架。 [Route("myapi/[controller]/[action]")]
用于 asp.net-core while your code appears to be for asp.net-web-api
一些建议的更改。
模块代码可以简化
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);
}
}
我正在尝试将 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 具有 defaults
和 constraints
参数的值。我将地图调用更新为:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: Constants.ApiBaseRoute + "/{controller}/{action}",
defaults: new { },
constraints: new { }
);
我还必须添加 action
模板参数。我删除了控制器上的路由属性。
您正在混淆框架。 [Route("myapi/[controller]/[action]")]
用于 asp.net-core while your code appears to be for asp.net-web-api
一些建议的更改。
模块代码可以简化
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);
}
}