Вопрос по c# – Response.End () против HttpContext.Current.ApplicationInstance.CompleteRequest () [duplicate]

6

This question already has an answer here:

Is Response.End() considered harmful? 8 answers

Пользователи нашего приложения скачивают вложение не реже одного раза в две секунды в течение дня.

Предыдущий сценарий:

Мы использовали Response.End (), чтобы прервать соединение с клиентом после того, как пользователь загрузил вложение. Поскольку у нас возникли проблемы с производительностью, мы начали регистрировать исключения, и одним из самых повторяющихся явилось исключение прерывания потока. Так как мы получаем вложение от веб-службы, нам нужно провести некоторую очистку, и мы провели очистку в блоке try-catch-finally. После некоторых исследований я понял, что любой код после Response.End () не будет выполнен, даже если он находится в блоке finally. Это правильно?

Текущий сценарий:

Я прочитал поток в переполнении стека о том, что Response.End () вреден, и его нужно использовать только тогда, когда он действительно необходим, поэтому я решил использовать HttpContext .... CompleteRequest (). С помощью этого кода необходимая очистка выполнена, но отображаемый HTML-код добавляется к загруженному вложению. Я попытался переопределить Render и RaisePostBackEvent, предложенные в той же статье, но проблема все еще сохраняется. Любая идея о том, как решить эту проблему, будет полезна.

Код:

HttpContext.Current.Response.Clear();

Response.ClearContent();

Response.ClearHeaders();

Response.AddHeader("Content-Disposition", "attachment; filename=" +   
filename);
Response.AddHeader("Content-Length", fileContent.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(fileContent);
Response.Flush();
Пожалуйста, не добавляйте префиксы к заголовкам "C #" & quot; и тому подобное. Вот для чего нужны теги. John Saunders
Конечно. Извини за это. Я только начал публиковать здесь. Я постараюсь не повторять это. user1396468

Ваш Ответ

2   ответа
0

и я не уверен, поможет ли это, но я делаю по сути то же самое, что и ваш пример при создании PDF-файлов для доставки в браузер. Тем не менее, в конце обработки у меня есть следующее:

    Response.OutputStream.Flush()
    Response.OutputStream.Close()
    Response.End()

Добавление .Close () в основном. Кажется, работает нормально на производстве.

Эд: Только что нашел это, упомянув Close ():Является ли Response.End () вредным?

Другой подход к вашей проблеме - просто переопределить Page_PreRender () и поместить туда код доставки контента (что имеет функциональный смысл). Тогда вы определенно не получите никакого нежелательного HTML-кода, и вообще не должно быть необходимости в Response.End ().

6

Response.End внутренне бросаетThreadAbortException чтобы убить запрос - если вам нужно сделать какую-то очистку, это нужно сделатьbefore призыв кResponse.End сделан.

Response.Redirect а такжеResponse.End плохо взаимодействовать с блоками try / catch. Таким образом, в вашей ситуации вы должны сделать всю свою логику записи в поток ответов в вашем try / catch, а затем просто вызватьResponse.End после вашего, наконец, блока.

Error: User Rate Limit Exceeded user1396468
Error: User Rate Limit Exceeded user1396468
Error: User Rate Limit ExceededResponse.EndError: User Rate Limit ExceededResponse.EndError: User Rate Limit ExceededThreadAbortExceptionError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user1396468

Похожие вопросы