Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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# 将URL转换为控制器/操作对_C#_Asp.net Mvc_Url Routing - Fatal编程技术网

C# 将URL转换为控制器/操作对

C# 将URL转换为控制器/操作对,c#,asp.net-mvc,url-routing,C#,Asp.net Mvc,Url Routing,在.Net MVC中,您将路由定义为RouteCollection。URL帮助器方法可以轻松地将控制器+操作+可选参数转换为URL 当.Net MVC处理来自客户端浏览器的请求时,它会将此URL清楚地映射到右侧的控制器+操作,以执行相应的命令 但是,我看不到一种通过编程方式动态访问此路由的方法,因此我无法将完全限定的URL(或10k+URL的列表)转换为其路由组件 是否有人知道您将如何转换,例如,以下字符串输入: "http://stackoverflow.com/questions/23423

在.Net MVC中,您将路由定义为
RouteCollection
。URL帮助器方法可以轻松地将
控制器
+
操作
+
可选参数
转换为URL

当.Net MVC处理来自客户端浏览器的请求时,它会将此URL清楚地映射到右侧的
控制器
+
操作
,以执行相应的命令

但是,我看不到一种通过编程方式动态访问此路由的方法,因此我无法将完全限定的URL(或10k+URL的列表)转换为其路由组件

是否有人知道您将如何转换,例如,以下字符串输入

"http://stackoverflow.com/questions/2342325/c-sharp-net-mvc-turning-url-into-controller-action-pair"
{
   controller: "questions",
   action: "view",
   id: 2342325,
   seoText: "c-sharp-net-mvc-turning-url-into-controller-action-pair"
}
进入以下输出

"http://stackoverflow.com/questions/2342325/c-sharp-net-mvc-turning-url-into-controller-action-pair"
{
   controller: "questions",
   action: "view",
   id: 2342325,
   seoText: "c-sharp-net-mvc-turning-url-into-controller-action-pair"
}
鉴于此映射显然是由.Net完成的,它是否公开在任何地方

为什么会有人想这样做?

假设您有一个已知已访问的url列表,大部分是动态的,例如
stackoverflow.com/questions/2342325/c-sharp-net-mvc-turning-url-into-controller-action-pair
,并且您希望计算出哪些实际端点/操作/控制器被编程命中(不太关心正在传递的实际数据)

您可以手动进行代码映射,这样您就知道
/questions/{id}/{text}
->
控制器:问题,操作:问题
,但这不是未来的证明,也不是有趣的,并且依赖于文本操作/处理


给定一个路由字典和一个URL列表,使用上面描述的函数,您可以查看哪些控制器被击中最多,或者哪些操作等等。

您应该看看如何创建自己的。这是MVC堆栈中的一点,路由引擎已经解析了URL,以找到要调用的控制器和操作,然后t通过这个方法来获得实际的C#类和方法来调用。还没有应用授权,甚至没有应用HTTP谓词,因此您将看到对应用程序的每个调用

public class CustomRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext context)
    {
        var controller = context.RouteData.Values["controller"];
        var action = context.RouteData.Values["action"];

        // Do whatever logging you want with this data, maybe grab the other params too.

        return base.GetHttpHandler(context);
    }
}
这可以很容易地在设置路由的地方注册

routes.MapRoute("Home", "{controller}/{action}", new
    {
        controller = "Home",
        action = "Index"
    })
    .RouteHandler = new CustomRouteHandler();

看起来实现这一点的唯一方法是创建一个虚拟HTTP上下文,类似于单元测试路由的方式。遗憾的是,MVC没有提供更好的访问权限,因为它是在每个请求上运行的,而不是将其包装在上下文对象中

无论如何,这里有一个可行的解决方案,可以根据您的需要进行修改:

公共类UrlToRouteMapper
{
公共静态RouteValueDictionary GetRouteDataFromURL(字符串绝对URL)
{
var testUrl=“~”+新Uri(绝对URL).AbsolutePath;
var context=new StubHttpContextForRouting(requestUrl:testUrl);
var routes=new System.Web.Routing.RouteCollection();
MVCAPApplication.RegisterRoutes(路由);
System.Web.Routing.RouteData RouteData=routes.GetRouteData(上下文);
返回路由数据值;
}
公共静态字符串GetEndpointStringFromURL(字符串绝对URL)
{
var routeData=GetRouteDataFromURL(绝对URL);
返回路由数据[“控制器”]+“/”+路由数据[“操作”];
}
}
公共类StubHttpContextForRouting:HttpContextBase{
StubHttpRequestForRouting\u请求;
stubhttpresponsefororrouring\u响应;
公共StubHttpContextForRouting(字符串appPath=“/”,字符串requestUrl=“~/”){
_request=newstubhttprequestforrouting(appPath,requestUrl);
_response=new StubHttpResponseForRouting();
}
公共重写HttpRequestBase请求{
获取{return\u request;}
}
公共覆盖HttpResponseBase响应{
获取{return\u response;}
}
}
公共类StubHttpRequestForRouting:HttpRequestBase{
字符串_appPath;
字符串_requestUrl;
公共StubHttpRequestForRouting(字符串appPath、字符串requestUrl){
_appPath=appPath;
_requestUrl=requestUrl;
}
公共重写字符串应用程序路径{
获取{return\u appPath;}
}
公共重写字符串AppRelativeCurrentExecutionFilePath{
获取{return\u requestUrl;}
}
公共重写字符串路径信息{
获取{return”“;}
}
}
公共类StubHttpResponseForRouting:HttpResponseBase{
公共重写字符串ApplyAppPathModifier(字符串virtualPath){
返回虚拟路径;
}
}

不清楚为什么要这样做,但可以使用
Uri=newuri(“http://stackoverflow.com/questions/ask”;
并检查其
段property@StephenMuecke-添加了“为什么”但我假定这些段只会告诉您URL段,而不关心调用的实际控制器/操作。在您的示例中,
segments[0]
将返回“问题”,而
segments[1]
将返回
“询问”
,但只有在没有为方法创建特殊路由的情况下,才会返回控制器和方法名称。@StephenMuecke我将更新示例,以便更清楚地了解我的要求。您提出的要求在技术上是不可行的。URL仅与特定路由或一组路由结合在一起才有意义,这些路由或一组路由决定了URL的使用方式解析了,初始化了什么控制器和操作。例如,我可以有一个映射URL“/foo/”的路由到
MyAwesomeController.MyAwesomeAction
。在这种情况下,完全不可能只查看URL字符串,就知道将调用哪个控制器和操作。我正在尝试转换字符串输入(URL),进入它的路由组件。如果我错了,请纠正我,但您的回答是假设存在要检查的请求?相反,假设您有一个包含10k URL的列表,并希望使用现有路由查看它们在当前应用程序中映射到的控制器/操作。如果我的问题不清楚,请道歉-欢迎编辑!您的问题真的不正确那就清楚了。你为什么要在URL被调用后检查它