[英]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.