Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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

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# 当文件实际存在于指定位置时的MVC路由_C#_Asp.net Mvc_Routing - Fatal编程技术网

C# 当文件实际存在于指定位置时的MVC路由

C# 当文件实际存在于指定位置时的MVC路由,c#,asp.net-mvc,routing,C#,Asp.net Mvc,Routing,因此,在IIS 7下运行的MVC 3应用程序中,我有这样一个路由: routes.MapRoute( "VirtualTourConfig", "virtualtour/config.xml", new { controller = "VirtualTour", action = "Config" } ); 诀窍在于文件实际上存在于/virtualtoor/config.xm

因此,在IIS 7下运行的MVC 3应用程序中,我有这样一个路由:

routes.MapRoute(
               "VirtualTourConfig",
               "virtualtour/config.xml",
               new { controller = "VirtualTour", action = "Config" }
               );
诀窍在于文件实际上存在于/virtualtoor/config.xml。看起来请求只是在该位置返回xml文件,而不是点击路由,路由处理xml,进行一些更改并返回自定义的XmlResult

如果文件存在于磁盘上,我如何告诉应用程序点击路由而不是实际文件,有什么建议吗


编辑:似乎我可以使用
routes.routeeExistingFiles=true,告诉应用程序忽略磁盘上的文件。但是,这会全局设置标志,并中断应用程序中的许多其他请求。例如,我仍然希望调用/assets/css/site.css返回css文件,而不必为每个静态资产专门设置路由。现在的问题是,有没有一种方法可以在每个路由的基础上实现这一点?

到目前为止,我找到的最佳答案是全局应用
路由。routeeExistingFiles=true
,然后有选择地忽略我想要传递到现有文件(如.js、.css等)的路由。因此,我最终得到了这样的结果:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("*.js|css|swf");
            routes.RouteExistingFiles = true;

            routes.MapRoute(
               "VirtualTourConfig",
               "virtualtour/config.xml",
               new { controller = "VirtualTour", action = "Config" }
               );
}

如果有人有更好的解决方案,我想看看。我更喜欢有选择地将“RouteExistingFIles”标志应用于各个路由,但我不知道是否有办法做到这一点。

这里没有解决方案,只是一个想法


您可以尝试实现基于您自己的解决方案,它将提供您自己的Web路径映射到文件系统路径,并使用缺省提供程序来解决所有您不想处理的路径。

< P>一个非常简单的解决方案,当然,如果您考虑史葛的答案,将是EG:<代码>路由。IgnoreRoute(“模板/*.html”);代码>,,
routes.IgnoreRoute(“scripts/*.js”)
路由.IgnoreRoute(“style/*.css”)

这使您既可以简单地向RouteCollection提供路径,又可以避免启动VirtualPathProvider等工作

您可以试试,例如:


我不认为有一个简单的方法来实现这一点。为什么不将静态文件移动到
~/App\u Data
文件夹中?
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="VirtualTourConfig">
          <match url="^virtualtour/config.xml" />
          <action type="Rewrite" url="virtualtour/config" />
        </rule>
      </rules>
    </rewrite>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Dashboard">
          <match url="^dashboard/(.+)" />
          <action type="Rewrite" url="ng/dashboard/{R:1}" />
        </rule>
      </rules>
    </rewrite>