当我的清洁,刚刚创建的新应用程序(集成。net 4.0)是在Visual Studio Web Server上一切工作正常。下面这样的链接可以正常工作,控制器返回图像。
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
);
}
我应该怎么做才能正常运行这个应用程序?
EDIT1:
问题在于扩展。当我删除扩展,然后请求指向图像控制器。扩展(jpg) iis首先请求(为什么!?)并返回404(不触摸图像控制器动作)。
EDIT2:
- IIS 7.5在Windows 7 64位
- App on Framework 4.0集成流水线
网络。修改前的配置:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
我找到了。Uchh…
我改变ExtensionlessUrlHandler路径从默认的'*。' to '*':
<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>
现在所有的请求都通过路由引擎。
然后我在'content/{*all}'中添加一个IgnoreRoute,其中我有所有静态内容文件。
如果部署了解决方案,也就是说,不仅针对您的解决方案进行了映射,而且按照应该的方式进行了部署,那么Server.MapPath
的结果将不会像您期望的那样。Server.MapPath
"default"文件夹是实际dll所在的位置。
解决这个问题的一种方法是将图像的"复制到输出目录"设置为"Copy alwats"或"Copy if newer"。
你可以使用Server.MapPath("~/content" + name);
之类的东西,但我会让你的解决方案找不到图像。
在项目的属性中,在Web选项卡上,在Use Local IIS Web Server
单选按钮下方的部分中,在项目Url框中,将条目更改为http://localhost:12345
。
然后,在IIS中编辑本地主机站点的http绑定,并将其更改为12345
你不应该被要求这样做。请确保您的应用程序池运行在集成管道模式