asp.net-web-api – Web API 2是否可以通过编程方式加载路由/控制器?
|
我目前正在开发一个使用WCF实现REST API的企业Web应用程序.它利用VirtualPathProvider捕获对* .svc文件(实际上并不存在)的请求,然后动态构建它们以动态加载相关的WCF服务.这允许系统具有可以在运行时添加到应用程序的“模块”,而不会影响Web服务器或使用它的任何人. 我想知道的是,如果在概念上可以使用Web API 2.我一直在做一些研究,但看起来路由只能在启动时配置…我希望的是一种手段处理不存在的路由,并且基本上使用请求中的控制器名称来查找并加载关联的程序集(如果存在),同时以编程方式向其添加新路由. 我刚刚开始使用Web API 2,所以我希望有一些更有经验的用户可以加入.基本上我的团队有兴趣转换到Web API 2以减少我们遇到的WCF的开销和复杂性,但这个特殊要求可能是一个交易破坏者. 解决方法好的,经过大量的研究……我已经找到了要覆盖的正确类,现在可以按需检查控制器是否能够被解析,如果没有,则尝试将正确的程序集加载到内存中(根据此时的控制器名称),并返回相关的控制器.这是代码: public class CustomHttpControllerSelector : DefaultHttpControllerSelector {
private readonly HttpConfiguration _configuration;
public CustomHttpControllerSelector(HttpConfiguration configuration) : base(configuration) {
_configuration = configuration;
}
public override HttpControllerDescriptor SelectController(HttpRequestMessage request) {
HttpControllerDescriptor controller;
try {
controller = base.SelectController(request);
}
catch (Exception ex) {
String controllerName = base.GetControllerName(request);
Assembly assembly = Assembly.LoadFile(String.Format("{0}pak{1}.dll",HostingEnvironment.ApplicationPhysicalPath,controllerName));
Type controllerType = assembly.GetTypes()
.Where(i => typeof(IHttpController).IsAssignableFrom(i))
.FirstOrDefault(i => i.Name.ToLower() == controllerName.ToLower() + "controller");
controller = new HttpControllerDescriptor(_configuration,controllerName,controllerType);
}
return controller;
}
}
当然,你需要在WebApiConfig的Register方法文件中替换服务: config.Services.Replace(typeof(IHttpControllerSelector),new CustomHttpControllerSelector(config)); 这里肯定还有很多工作要做,但这是一个好的开始.它允许我在托管网站启动和运行时动态添加控制器,而不需要中断. 这段代码的主要问题显然是新加载的控制器没有添加到已注册的控制器列表中,因此总是抛出异常并处理每个请求(对于那些控制器).我正在研究是否可以某种方式将其添加到注册列表中,因此我们将看到这导致了什么. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在MVC中的业务规则
- asp.net-mvc – 如何使用FluentValidation在ClientSide中验
- 模型绑定 – WebApi2:自定义参数绑定以绑定部分参数
- asp.net – Web API服务 – 如何在异步任务中使用“HttpCon
- asp.net – 缺少AuthenticationManager引用
- asp.net-mvc – 部署AntiforgeryToken错误
- asp.net – 多租户架构的实体框架 – 按租户ID过滤单个表
- asp.net-core – 你如何解决AspNet Core缺少的依赖关系?
- asp.net – Url重写与路由
- asp.net核心 – ASP.NET核心中的基本身份验证
- 实体框架 – Unity Lifetime Managers和EF Data
- 对asp.net网站进行基准测试,我可以使用jmeter吗?
- asp.net-mvc-4 – 如何通过MVC4 upshot上传相关实
- asp.net – 谁负责处理HttpPostedFile.InputStre
- asp.net-mvc – AJAX POST到MVC Controller显示3
- asp.net-mvc – 帮助/提示提高我的ASP.NET MVC 2
- .net – SignalR长轮询在5秒内断开连接
- asp.net-mvc – MVC4上的服务堆栈
- asp.net – 如何让Html.RenderAction在帖子上调用
- asp.net – 对于每个循环都有控件并在MVC 4中提交
