Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 当id具有文件扩展名时,ASP.NET MVC 4路由不工作_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Routing - Fatal编程技术网

C# 当id具有文件扩展名时,ASP.NET MVC 4路由不工作

C# 当id具有文件扩展名时,ASP.NET MVC 4路由不工作,c#,asp.net,asp.net-mvc,asp.net-mvc-4,routing,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Routing,在MVC 3中我没有问题,但现在我去了MVC 4,我有问题 URL如下所示: {controller}/{action}/{id} /podcast/file/PODCAST-01.MP4 其中PODCAST-01.MP4是id;当它点击控制器时,控制器会将文件发送到客户端,这样我们就可以很容易地计算有多少人下载了文件 然而,现在,web服务器认为应该有一个文件,并给出了404错误。我试着通过创建自己的404错误页面,然后用/podcast/file?id=podcast-01.MP4重定向

在MVC 3中我没有问题,但现在我去了MVC 4,我有问题

URL如下所示:

{controller}/{action}/{id}

/podcast/file/PODCAST-01.MP4
其中PODCAST-01.MP4是id;当它点击控制器时,控制器会将文件发送到客户端,这样我们就可以很容易地计算有多少人下载了文件

然而,现在,web服务器认为应该有一个文件,并给出了404错误。我试着通过创建自己的404错误页面,然后用/podcast/file?id=podcast-01.MP4重定向回来来绕过这个问题,但这不起作用,因为iTunes不喜欢它,它不喜欢“?”

我尝试创建一条新路线:

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}.{format}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, format = UrlParameter.Optional });
但这似乎打破了路线。任何帮助都会很好。

你不能那样做(我想)
您必须在分析请求的代码中保留后缀。

您可以这样做。在MVC 4解决方案中,web配置包含:

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

您只需在这些路径之前添加一个新的处理程序

<add name="ManagedFileWithExtension" path="podcast/file*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />


当你说它破坏了路由时,会发生什么?一目了然,它看起来是正确的。当我转到任何页面时,都会出现此错误:“HTTP错误403.14-禁止Web服务器配置为不列出此目录的内容。”当我更改RouteConfig.cs时,如何添加一个明确定义文件名应具有(和不具有)的
约束部分?(从历史上看,这个路由也有问题)对于这个路由
{controller}/{action}/{id}.{format}
,您需要转义点,因为路由实际上是正则表达式。如果使用
{controller}/{action}/{id}\.{format}
,会发生什么情况?可能存在重复的