Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Routes.MapHttpRoute获取控制器实例_C#_Asp.net_Asp.net Mvc_Asp.net Web Api_Controller - Fatal编程技术网

C# 从Routes.MapHttpRoute获取控制器实例

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方法。下面我复制了这段代

在我工作的一个现有的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的指导原则,我会调整。我也有同样的偏好,但如果你习惯了这个标签系统,你就会开始喜欢它;。。。