在应用程序文件夹中运行时,无法使自定义错误页在ASP.NET MVC应用程序中工作

时间:2016-06-03 09:46:49

标签: c# asp.net asp.net-mvc iis web-config

我有一个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>

上述设置有效,但如果不使用路径中的文件夹名称,我无法使其正常工作。基于documentationpath属性相对于站点根目录。

  

如果选择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);
}

1 个答案:

答案 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();
}

然后,这将呈现您的自定义视图。这种做错误页面的方法取决于你的用例,但这就是我设法让自定义错误页面工作的方式。