我正在使用System.Web.Mvc.Controller
用于UI,System.Web.Http.ApiController
用于API,用于为大型ERP应用程序创建Web界面原型。我已经找到了一种方法,可以通过问题Deploying un-compiled ASP.NET MVC Razor application使UI具有一定的可扩展性。现在我想知道,由于ApiController
的严格性,如果有其他类我应该考虑提供一个开放式接口来定义自定义API事务。或者是否有某种方法可以以更开放的方式使用ApiController
,其中参数计数和类型可能会有所不同......也许是通过接受对象参数?
答案 0 :(得分:0)
对于Web API,您可以尝试使用IHttpActionSelector interface:
实现自定义操作选择器public class CustomActionSelector : IHttpActionSelector
{
public override HttpActionDescriptor SelectAction(HttpControllerContext context)
{
var method = GetMethod(context);
return new ReflectedHttpActionDescriptor(GetController(method), method);
}
private MethodInfo GetMethod(HttpControllerContext context)
{
// Locate the target method using the extensibility framework of your choice
// (for example, MEF, pure reflection, etc.)
}
private HttpControllerDescriptor GetController(MethodInfo method)
{
return new HttpControllerDescriptor()
{
ControllerName = method.DeclaringType.Name,
ControllerType = method.DeclaringType
};
}
}
要注册新的操作选择器,请将以下内容放在global.asax
下的Application_Start
文件中:
var config = GlobalConfiguration.Configuration;
config.Services.Replace(typeof(IHttpActionSelector), new CustomActionSelector());
希望这有帮助。
答案 1 :(得分:0)
使ASP.NET Web应用程序可扩展非常简单,因为ASP.NET在bin目录中搜索所有程序集中的控制器类。因此,如果提供自定义的一方可以简单地将其代码编译到DLL中并将其放入bin目录中,那么您的Web应用程序将从标准交付中获取所有控制器以及控制器。作为示例,我在引用System.Web.Http
和System.Web.Mvc
的独立DLL中创建了以下类:
Public Class CustomTestController
Inherits ApiController
Public Function GetValues() As IEnumerable(Of String)
Return New String() {"value1", "value2"}
End Function
End Class
我只是编译它并将其复制到部署我的Web应用程序的位置的bin目录,然后我可以访问http://localhost/MyApplication/api/CustomTest/
并返回value1
和value2
预期的回应。