C# 从Routes.MapHttpRoute获取控制器实例
在我工作的一个现有的C Web项目中,我添加了一个Web API部件 在我自己用于Web API的四个类中,我需要访问一些现有的控制器类。现在我只是创建了它们的一个新实例,一切都按预期进行:ProductController=new ProductController 尽管如此,创建一个新的ProductController(虽然它应该已经存在)显然不是一个好的做法。我知道控制器是在Routes.MapHttpRoute的配置文件中创建的,因为它使用的是C Web MVC方法。下面我复制了这段代码:C# 从Routes.MapHttpRoute获取控制器实例,c#,asp.net,asp.net-mvc,asp.net-web-api,controller,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Controller,在我工作的一个现有的C Web项目中,我添加了一个Web API部件 在我自己用于Web API的四个类中,我需要访问一些现有的控制器类。现在我只是创建了它们的一个新实例,一切都按预期进行:ProductController=new ProductController 尽管如此,创建一个新的ProductController(虽然它应该已经存在)显然不是一个好的做法。我知道控制器是在Routes.MapHttpRoute的配置文件中创建的,因为它使用的是C Web MVC方法。下面我复制了这段代
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MyProject.Controllers" }
);
route.DataTokens["UseNamespaceFallback"] = false;
我尝试在我的一个API类中访问这些控制器,如下所示:
private void getControllerInstance()
{
var url = "~/Products";
// Original path is stored and will be rewritten in the end
var httpContext = new HttpContextWrapper(HttpContext.Current);
string originalPath = httpContext.Request.Path;
try
{
// Fake a request to the supplied URL into the routing system
httpContext.RewritePath(url);
RouteData urlRouteData = RouteTable.Routes.GetRouteData(httpContext);
// If the route data was not found (e.g url leads to another site) then authorization is denied.
// If you want to have a navigation to a different site, don't use AuthorizationMenu
if (urlRouteData != null)
{
string controllerName = urlRouteData.Values["controller"].ToString();
// Get an instance of the controller that would handle this route
var requestContext = new RequestContext(httpContext, urlRouteData);
var controllerFactory = ControllerBuilder.Current.GetControllerFactory();
// TODO: Fix error (The controller for path '/Products' was not found or does not implement IController.) on this line:
var controllerbase = (ControllerBase)controllerFactory.CreateController(requestContext, controllerName);
controller = (ProductController)controllerbase;
}
}
finally
{
// Reset our request path.
httpContext.RewritePath(originalPath);
}
}
正如您可能已经注意到的TODO注释所示,在var controllerbase=ControllerBasecontrollerFactory.CreateControllerrequestContext,controllerName;,行中;,我得到以下错误:
用户代码未处理HttpException:未找到路径“/Products”的控制器或未实现IController
有人知道如何修复此错误吗?这是否与配置文件中的以下两行代码之一有关
namespaces: new[] { "MyProject.Controllers" }
route.DataTokens["UseNamespaceFallback"] = false;
还是我做错了什么?给大家的提示:当你非常非常累的时候,不要继续编程。。不管怎么说,除了一个小瑕疵,一切都是正确的: 我的API控制器称为ProductsController,我的常规默认控制器称为ProductController。在上述方法中,我使用:
var url = "~/Products";
要访问ProductController
因此,在移除s之后,为了更好地测量,将所有内容都简化为小写,我有以下内容:
var url = "~/product";
现在它工作了。@chrfin为什么要删除我问题标题中的C Web部件?我总是在问题的前面添加编程语言,这样人们在stackoverflow问题中滚动时可以更容易地看到它是用于C的。我知道这也可以在标记处看到,但是如果它也在标题中,不是更容易发现吗?标记不应该添加到标题中-这就是准则。如果像我这样的人只想问C问题,他可以简单地点击标签并将其过滤掉。请参阅->我应该在标题中使用标记吗?@chrfin感谢您的回复和链接。就我个人而言,我觉得在标题中添加标签比在问题下方添加标签更容易识别,但如果这是stackoverflow的指导原则,我会调整。我也有同样的偏好,但如果你习惯了这个标签系统,你就会开始喜欢它;。。。