Asp.net mvc 3 IIS7.5上的MVC3应用程序,路径为文件x.jpg不工作
当我的新应用程序(.net 4.0集成版)在Visual Studio Web服务器上运行时,一切正常。下面这样的链接工作正常,控制器返回图像Asp.net mvc 3 IIS7.5上的MVC3应用程序,路径为文件x.jpg不工作,asp.net-mvc-3,.net-4.0,routing,iis-7.5,Asp.net Mvc 3,.net 4.0,Routing,Iis 7.5,当我的新应用程序(.net 4.0集成版)在Visual Studio Web服务器上运行时,一切正常。下面这样的链接工作正常,控制器返回图像 http://localhost:12345/image/a.jpg 但当我在IIS 7.5上运行此应用程序时,IIS将控制并报告404 http://localhost/testmvc3/image/a.jpg 控制器: public class ImageController : Controller { public ActionRes
http://localhost:12345/image/a.jpg
但当我在IIS 7.5上运行此应用程序时,IIS将控制并报告404
http://localhost/testmvc3/image/a.jpg
控制器:
public class ImageController : Controller
{
public ActionResult Index(string name)
{
var dir = Server.MapPath("~/content/" + name);
return File(dir, "image/jpg");
}
}
路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Image", // Route name
"image/{*name}", // URL with parameters
new { controller = "Image", action = "Index", name = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
要正确运行此应用程序,我应该更改什么
编辑1:问题在于扩展。当我移除扩展时,请求指向图像控制器。对于扩展名(jpg),iis首先接受请求(为什么!?)并返回404(不涉及图像控制器操作) 编辑2:
- Windows 7上的IIS 7.5 64位
- 框架4.0集成管道上的应用程序
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
如果部署了解决方案,也就是说,不仅针对您的解决方案进行了映射,而且还按照应该的方式进行了部署,
Server.MapPath
的结果将不符合您的预期。Server.MapPath
“default”文件夹是实际dll所在的文件夹
解决此问题的一种方法是将图像的“复制到输出目录”设置为“复制alwats”或“如果更新,则复制”
您可以使用类似于
Server.MapPath(“~/content”+name”)的东西代码>,但我认为这将使您的解决方案无法找到映像。如果部署了解决方案,即不仅映射到您的解决方案,而是按照它应该的方式进行部署,那么Server.MapPath
的结果将不会如您预期的那样。Server.MapPath
“default”文件夹是实际dll所在的文件夹
解决此问题的一种方法是将图像的“复制到输出目录”设置为“复制alwats”或“如果更新,则复制”
您可以使用类似于Server.MapPath(“~/content”+name”)的东西代码>,但这将使您的解决方案无法找到图像。在项目属性的“Web”选项卡上,单选按钮下方的“使用本地IIS Web服务器”部分,在项目Url框中,将条目更改为http://localhost:12345
然后,在IIS中,编辑本地主机站点的http绑定,并将其更改为12345。在项目属性的“Web”选项卡上,单选按钮下方的“使用本地IIS Web服务器”部分中,在项目Url框中,将条目更改为http://localhost:12345
然后,在IIS中,编辑本地主机站点的http绑定,并将其更改为12345。我找到了它。啊
我将ExtensionlessUrlHandler路径从默认的“*。”更改为“*”:
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add
name="ExtensionlessUrlHandler-Integrated-4.0"
path="*"
verb="GET,HEAD,POST,DEBUG"
type="System.Web.Handlers.TransferRequestHandler"
resourceType="Unspecified"
requireAccess="Script"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
现在所有请求都通过路由引擎
然后我将一个IgnoreRoute添加到'content/{*all},在那里我有所有静态内容文件。我找到了它。啊
我将ExtensionlessUrlHandler路径从默认的“*。”更改为“*”:
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add
name="ExtensionlessUrlHandler-Integrated-4.0"
path="*"
verb="GET,HEAD,POST,DEBUG"
type="System.Web.Handlers.TransferRequestHandler"
resourceType="Unspecified"
requireAccess="Script"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
现在所有请求都通过路由引擎
然后我将IgnoreRoute添加到“content/{*all}”中,在那里我有所有静态内容文件。您不需要这样做。确保应用程序池以集成管道模式运行。您不需要这样做。确保应用程序池以集成管道模式运行。问题在于IIS首先采用路由,并将其与不存在的文件相匹配。为什么IIS会控制我的应用程序?问题在于IIS首先选择路由并将其与不存在的文件匹配。为什么IIS控制我的应用程序?将Phil Haack的Route Debugger NuGet包添加到项目中,并在页面底部检查路由结果。正如我所说,路由引擎不会启动。IIS立即报告404。将Phil Haack的Route Debugger NuGet包添加到项目中,并在页面底部检查路由结果。正如我所说的,路由引擎不会启动。IIS立即报告404。对不起,您的第一句话是关于开发服务器的,我没有听到。我试过你的方案,一切都很顺利。当我切换到classic pipeline时,我得到了您描述的404错误抱歉,您的第一句话是关于开发服务器的,我没有听到。我试过你的方案,一切都很顺利。当我切换到经典管道时,我得到了您描述的404错误