2010-08-12 2 views
0

Я хочу показать страницу пользовательской ошибки, если пользователь пытается загрузить файл, превышающий максимальную длину запроса.Как перенаправить с Application_Error в ASP.NET MVC 2?

Не имея никакого кода, при загрузке большого файла появляется очень загадочная ошибка «Невозможно отобразить страницу» (не известная страница с ошибкой ASP) - такая же ошибка браузера, которую вы получаете, когда ты не в сети. Это кажется мне странным и, вероятно, имеет какое-то отношение к этой проблеме.

Я добавил это в мой файл Global.asax:

//simplification 
    public void Application_Error(object sender, EventArgs e) 
    { 
     Response.Redirect("http://www.google.com", false); //This IS getting hit 
    } 

Пользовательские ошибки выключены в моем файле Web.config (и должен оставаться таким образом).

Кажется довольно простым, не так ли? Но по какой-то причине это перенаправление просто ничего не делает. Он попадает. Он выполняет эту строку. Я попробовал его с endResponse, установленным как true; нет разницы.

Я попытался следующие две строки перед перенаправлением:

Response.Clear(); 
Server.ClearError(); 

Первый я полагаю, будет обращаться с переадресацией, возникающую после заголовки были посланы (это не так); во-вторых, я не совсем уверен в том, что бы это значило, но я видел этот код в похожих вопросах/ответах StackOverflow, поэтому я решил попробовать.

Итак - есть ли что-то особенное в этой конкретной ошибке, которая делает невозможным перенаправление?

Если вы хотите попробовать его для себя (и посмотреть, что я имею в виду о странных ошибках не-странице), вот некоторая быстро copypasta добавить в стандартном MVC приложение VS в:

Views -> Home -> Index.aspx

<asp:Content ContentPlaceHolderID="MainContent" runat="server"> 
    <form enctype="multipart/form-data" method="post" action="<%= Url.Action("Upload") %>"> 
     <input type="file" name="required-to-post" /> 
     <input type="submit" value="Upload" /> 
    </form> 
</asp:Content> 

Controllers -> HomeController.cs

public ActionResult Upload() 
{ 
    return View("Index"); 
} 

Global.asax

protected void Application_Error() 
{ 
    Response.Redirect("http://www.google.com", false); 
} 

Затем просто загрузите большой файл (5 МБ), и он должен дать эту загадочную ошибку (без перенаправления).

ответ

0

Это довольно старый вопрос и тот, который я решил некоторое время назад, хотя я и не писал ответа здесь.

Если я правильно помню, проблема была на самом деле с сервером IIS, а не с приложением MVC. Сам сервер имел максимальную длину запроса, и все это происходило очень странно, когда это правило было нарушено.

Изменяя максимальный размер запроса сервера, я считаю, что проблема исчезла. Но я не знаю, возможно ли это на локальном сервере, который запускается VS при попытке отладки приложения MVC.

В любом случае, я считаю, что делаю что-то принципиально неправильно, пытаясь разрешить загрузку большого файла через HTML-форму. Вместо этого я реализовал асинхронный загрузчик файлов, чтобы не беспокоиться об этом - он обеспечивает гораздо лучшую пользовательскую функциональность, и мне больше не придется почесывать голову над этим.

3

я был в состоянии исправить мою проблему. Обработка ошибок также отправила электронное письмо с подробным описанием ошибки. Это вызывало другое исключение. Но исключение не разрешено всплывать, поэтому я не смог его увидеть.

Короче говоря, убедитесь, что ничто не бросает другое исключение, и все должно работать нормально.

И вопреки тому, что опубликовал другой плакат, вам не нужно переписывать весь блок обработки ошибок ... Боже, я ненавижу, когда люди это делают. «О, я знаю ответ на ваш вопрос. Просто повторите все это после этого примера!». Как насчет того, как вы читаете код и пытаетесь его отладить. Если вы не можете тогда просто не отвечать. Просто потому, что вы отвечаете на вопрос, это не значит, что вы умнее, чем тот, кто его спрашивает.

Смежные вопросы