簡體   English   中英

在應用程序文件夾中運行時,無法使自定義錯誤頁面在ASP.NET MVC應用程序中工作

[英]Cannot make custom error pages work in ASP.NET MVC application when running in application folder

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

上面的設置有效,但是如果不使用路徑內的文件夾名稱,則無法使其正常工作。 根據文檔path屬性是相對於站點根目錄的。

如果選擇ExecuteURL響應模式,則該路徑必須是服務器相對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);
}

由於您的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();
}

然后將呈現您的自定義視圖。 這種處理錯誤頁面的方法取決於您的用例,但這就是我設法使自定義錯誤頁面起作用的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM