我想在自托管 WebApi 时禁用自动发现 Controller ,并在运行时手动指定 Controller 并将它们与路由相关联。
Filip W 在 customising controller discovery 上写了一篇不错的文章这让我相信我可以简单地实现 IHttpControllerTypeResolver
或 IAssembliesResolver
来操纵自动发现什么都不做,但这只解决了一半的问题,感觉很糟糕它解决了一半问题的解决方案——我想有效地禁用发现;但这感觉更像是屠杀发现但保留它......?
一旦发现被禁用,我想通过指定一个 Controller (或 Controller 工厂?)来补偿,这将在服务器初始化之前确定。我可以使用 IHttpControllerSelector
处理路由方面,但是我看不出我应该如何指定一个 Controller ,以便 WebApi 知道它才能工作。
总而言之,我想:
- 禁用 Controller 发现
- 明确指定 Controller (实例、类型或工厂)
实现此目标的最合适方法是什么(如果有)?
我不受任何特定版本的约束;目前使用 .Net Framework 4.7.2 和 Microsoft.AspNet.WebApi.OwinSelfHost
5.2.6。
最佳答案
我认为 HttpControllerSelector 是执行此操作的正确方法。 这是一个小例子:
HttpControllerSelector:
public class HttpControllerSelector : IHttpControllerSelector
{
private readonly HttpConfiguration _httpConfiguration;
public HttpControllerSelector(HttpConfiguration httpConfiguration)
{
this._httpConfiguration = httpConfiguration;
}
public HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
return new HttpControllerDescriptor(this._httpConfiguration,
nameof(ValuesController),
typeof(ValuesController));
}
public IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
{
var mapping = new Dictionary<string, HttpControllerDescriptor>
{
{
nameof(ValuesController),
new HttpControllerDescriptor(this._httpConfiguration,
nameof(ValuesController),
typeof(ValuesController))
}
};
return mapping;
}
}
WebApi配置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.Services.Replace(typeof(IHttpControllerSelector), new HttpControllerSelector(config));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
因此,在 HttpControllerSelector 中,您可以做任何您想做的事情。作为一个简单的例子,有一个总是被选中的 Controller 。此时你可以使用工厂或适合你的东西。
要禁用正常发现,您必须覆盖 WebApiConfig 中显示的正常选择器。
希望这让您知道如何去做,编码愉快!
关于c# - 手动注册 WebApi Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52591130/