我有一个ASP.NET MVC应用程序,它部署在IIS的默认网站中,并在应用程序文件夹中运行,例如: http://localhost/appfolder
。
我有两个错误页面,我尝试使用web.config中的<httpErrors>
部分设置它们。
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="401" />
<remove statusCode="500" />
<error statusCode="401" responseMode="ExecuteURL" path="/appfolder/Home/NoAccess" />
<error statusCode="500" responseMode="ExecuteURL" path="/appfolder/Home/Error" />
</httpErrors>
上述设置有效,但如果不使用路径中的文件夹名称,我无法使其正常工作。基于documentation,path
属性相对于站点根目录。
如果选择ExecuteURL响应模式,则路径必须为a 服务器相对URL(例如,/ 404.htm)。
因此,考虑到上述情况,以下内容应该有效,但事实并非如此。
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="401" />
<remove statusCode="500" />
<error statusCode="401" responseMode="ExecuteURL" path="/Home/NoAccess" />
<error statusCode="500" responseMode="ExecuteURL" path="/Home/Error" />
</httpErrors>
此外,使用~/Home/NoAccess
根本不起作用,似乎IIS只是将~
放入URL中。
我的问题:是否可以在不使用应用程序文件夹名称的情况下进行上述设置?
修改:请参阅此代码段中我的应用程序如何授权每个请求。
public class AppAutorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool authorized = false;
// Business logic to decide if authorized
return authorized;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
}
}
它在控制器中的使用是:
[HttpGet]
[AppAutorize]
public ActionResult Item(int id)
{
Models.Home.Item model = new Models.Home.Item(id);
return View("Item", model);
}
答案 0 :(得分:1)
由于您的Web应用程序托管在另一个网站下,因此错误页面的正确站点相对路径将是您所说的工作路径。我知道这不是您希望看到的,但处理此问题的最佳方法是替换httpErrors
文件中的Web.Release.config
元素,如下所示:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document Transform">
<system.webServer>
<httpErrors xdt:Transform="Replace">
<remove statusCode="401" />
<remove statusCode="500" />
<error statusCode="401" responseMode="ExecuteURL" path="/appfolder/Home/NoAccess" />
<error statusCode="500" responseMode="ExecuteURL" path="/appfolder/Home/Error" />
</httpErrors>
</system.webServer>
</configuration>
并使标准Web.config
保留不包含 appfolder 路径的路径。
我倾向于回避使用Web配置,而是将HTTP错误设置为以下内容:
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough" />
然后我有一个基本控制器,我的所有控制器继承了每个错误代码的方法,我想要一个自定义页面。所以在你的情况下:
public ViewResult NoAccess()
{
Response.StatusCode = (int) HttpStatusCode.Unauthorized;
return View("NoAccess");
}
然后在任何控制器中的使用非常简单:
public ActionResult Test()
{
return NoAccess();
}
然后,这将呈现您的自定义视图。这种做错误页面的方法取决于你的用例,但这就是我设法让自定义错误页面工作的方式。