mahakaal Ответов: 1

как вызвать ответ.Перенаправление после ответа.TransmitFile


как мы можем вызвать response. redirect после ответа.TrsnsmitFile

Prasad Khandekar

Привет,

К сожалению, вы не можете вызвать перенаправление после TransmitFile. Согласно документации MSDN для ответа.Redirect (string url), он вызовет исключение HttpException, когда "перенаправление будет предпринято после отправки HTTP-заголовков". С Момента Ответа.Перенаправление (string url) использует заголовок ответа Http "Location" (http://en.wikipedia.org/wiki/HTTP_headers#Responses), вызов его приведет к отправке заголовков клиенту. Это означает, что если вы вызовете его во второй раз или после того, как вы вызвали отправку заголовков каким-либо другим способом, вы получите исключение HttpException.

Вместо этого вы можете перенаправить его на страницу с тегом meta-refresh (http://en.wikipedia.org/wiki/Meta_refresh) в разделе<head></head & gt;, указывая на url-адрес загрузки. Таким образом, перенаправленная страница сначала появится в браузере, а затем через некоторое время файл будет загружен.

например, & lt;meta http-equiv= "refresh" content= "5; url=http: / / example. com / getFile? id=537373" >

С уважением,

mahakaal

Спасибо Прасаду за то, что вы поделились ценной информацией...

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Пожалуйста, проверьте мой ответ.

mahakaal

Тадит, спасибо, что ваше предложение сработало для меня ... но не поможете ли вы мне, если я попытаюсь решить ту же проблему с другим подходом?..

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Добро пожаловать. Итак, в чем же заключается другой подход? Объяснять.

mahakaal

на самом деле это не совсем другой подход. Правильно знаю, что я сохраняю pdf-файл, сгенерированный из crystal report, на своем сервере, а не отправляю его в браузер.. Могу ли я напрямую отправить pdf-файл в браузер, не сохраняя его?.

Ниже приведен мой код

использование системы;
использование системы.Коллекции.Общий;
использование System. Linq;
использование системы.Сеть;
используя системы.Веб.ИП;
используя системы.Веб.Пользовательского интерфейса.WebControls;
использование кристаллических решений.CrystalReports.Двигатель;
использование кристаллических решений.CrystalReports;
использование кристаллических решений.Общий;
использование кристаллических решений.Сеть;
использование кристаллических решений.Отчет;
использование кристаллических решений.ReportSource;
используя системы.Данных.Поставщики sqlclient;
использование системы.Конфигурация;
использование системы.Нарезание резьбы;
общественные частичное SaveJobCard класс : система.Веб.Пользовательского интерфейса.Страницы
{
protected void Page_Load(отправитель объекта, EventArgs e)
{

строка PDFName, temp;
если (запрос.QueryString ["jobid"].Метод toString() != "")
{
PDFName = Запрос.QueryString ["jobid"].Метод toString();
temp = PDFName;
PDFName=PDFName.Метод toString();
PDFName = Окружающая Среда.GetFolderPath(Environment.Специальная папка.Рабочий стол)+ " \ \ temp\\"+ PDFName +". pdf";
}
ещё
{
PDFName = " отчет";
}
использование (SqlConnection con = new SqlConnection())
{
против.ConnectionString = ConfigurationManager.ConnectionStrings ["dsd"].Параметр connectionString;
против.Открыть();
Команда sqlcommand команду cmd = новый sqlcommand, который();
УМК.Подключение = кон;
УМК.CommandText = " удалить с JobCard";
УМК.Метод executenonquery();
cmd.CommandText = "ВСТАВИТЬ INTO JobCard (jobno, job_name, Bill_noBill, job_type, Department, login_date, dispatch_dateTime, dmode, company_name, Client_department, contact_person, contact_no, Email_id, Delivery_addl1, Delivery_addl2, Delivery_addate_PDate_Data_, Delivery_addl2, Delivery_addate_PDate_Description , PO_No, Paper_type, Paper_size, Grammage, qty, LPrint_Remark, lBind_Remark, LDispatch_Remark, отправлено, доставлено, challan_ready, SONo, acc_remarks, challan_no, Tran_Id, guid, printdoneby, login_donetime, DOCTINDONE , Cordinator_PrintingRemark, Dispatch_done_remark, Delivery_done_remark, Need_Form38, изменять, consulted_person, C_media, Modification_remark, old_dispatch_date, переполнение, PendingFromBinding, PendingFromPrinting, PendingFromChallan, BindingDoneRemarks, PrintingDoneRemarks, ItemRate, TotalAmount) ВЫБРАТЬ jobno, job_name, Bill_noBill, job_type, отдел, login_date, dispatch_dateTime, dmode, company_name, Client_department, contact_person, contact_no, Email_id, D elivery_addl1, Delivery_addl2, Delivery_addl3, Delivery_City, Delivery_State, Delivery_Pin, PMethod, PO_Date, PO_No, Paper_type, Paper_size, Grammage, qty, LPrint_Remark, lBind_Remark, LDispatch_Remark, отправлено, маркировка_отправки, отправлено printdonetime, bindingdonetime, bindingdoneby, loginby, Diff_Location, DLocation_path, Проверьте, Binding_remark, Cordinator_PrintingRemark, Dispatch_done_remark, Delivery_done_remark, Need_Form38, модифицируют, consulted_person, C_media, Modification_remark, old_dispatch_date, переполнение, PendingFromBinding, PendingFromPrinting, PendingFromChallan, BindingDoneRemarks, PrintingDoneRemarks, ItemRate, TotalAmount ОТ логин, где JobNo = '"+ Request.QueryString [" jobid "]. ToString () +"' ";
УМК.Метод executenonquery();
УМК.Располагать();
против.Закрывать();
}


Документе printJ = новая документе();

// строке filename = "тест.РПТ";

//Session ["file"] = " yes";
printJ.Загрузить(Сервер.MapPath ("JobCard.rpt"));
printJ.SetDatabaseLogon("СА", "покраснели@1234", "192.168.1.7", "DispatchStatus");
printJ.Обновить();
ExportOptions CrExportOptions;
DiskFileDestinationOptions CrDiskFileDestinationOptions = новые DiskFileDestinationOptions();
PdfRtfWordFormatOptions CrFormatTypeOptions = новые PdfRtfWordFormatOptions();
CrDiskFileDestinationOptions.DiskFileName

mahakaal

= PDFName;
CrExportOptions = printJ. ExportOptions;
CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions;
CrExportOptions.FormatOptions = CrFormatTypeOptions;
printJ. Export(CrExportOptions);
printJ.Распоряжаться();
printJ.Рядом();
СБОРЩИК МУСОРА.Собирать();
Ответ.ContentType = " приложение / pdf";
Ответ.AddHeader ("Refresh", " 3; url=joblogin.aspx");
Ответ.AppendHeader ("Content-Disposition","attachment; filename=" +Request.QueryString ["jobid"].ToString ()+". pdf");

Ответ.TransmitFile(PDFName);

}

}

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Измените расположение содержимого на встроенное вместо вложения.

1 Ответов

Рейтинг:
6

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Проблема


  • То Response.Redirect() до того, как Response.End() перенаправит, но файл никогда не будет сгенерирован.
  • Если вы поставите Response.Redirect() после Response.End(), файл будет сгенерирован,но он не будет перенаправлен.


Решения


  1. Отображение сообщения "спасибо" в начале генерации файла.
    Пользователи все равно привыкли к этому, и вы можете сказать это так: “Спасибо. Ваша загрузка начнется через секундуЭто самый современный подход.
  2. Ссылаться - Перенаправление на другую страницу после вызова Response. End () в C#[^]
    Цитата:
    Я предлагаю добавить заголовок перенаправления. Что-то вроде этого:
    Response.AddHeader("Refresh", "3; url=index.html");

    Где 3-временная задержка и index.html является ли url-адрес, на который вам нужно перенаправить


mahakaal

Тадит, решение, которое ты мне дал, работает, но не во всех интернет-браузерах.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Какое решение вы пробовали? Второй?
В каком браузере он не работает?

mahakaal

либо в chrome, либо в firefox..
я попробовал второй.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Хорошо, тогда переходите к решению 1, которое является самым популярным и современным.

mahakaal

Талит,я еще не пробовал 1-й метод. но после того, как попробовал второй способ. я думал сделать это с помощью таймера. что служит моей цели. но мне бы хотелось услышать ваше предложение. Ниже приведена логика, которую я использовал для этого.

на кнопку Отправить
1. я сохраняю информацию в базе данных
2. Сохранение jobno в сессии переменную сессии["temp_jobno"] и после перезагрузки страницы
3.на странице load event если значение session["temp_jobno"] не равно null, то вызывается таймер с интервалом 1 сек.
4.при тиковом событии таймера я сохраняю значение сеанса в строковую переменную(которая является acutally jobno) и устанавливаю session["temp_jobno"]=null, а также отключаю управление таймером, а затем отправляю pdf-файл в браузер для dowload.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Хорошо... Звучит неплохо. Есть какие-то проблемы?

mahakaal

это работает... но должен ли я продолжать эту логику или мне следует попробовать 1-е решение, которым вы поделились.

но я не мог найти первого решения. как это сделать ...

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Если он не работает в некоторых браузерах, как вы уже упоминали, так что лучше пойти на 1-е решение.

Ваша цель-перенаправить на другую страницу и показать благодарственное сообщение.
Итак, согласно решению 1, Сначала вы перенаправляетесь на страницу, а затем показываете сообщение со словами "Спасибо за загрузку. Загрузка начнется через несколько секунд.".
А потом вы пишете логику для загрузки на этой странице. - Понял?

Например -
http://www.opensubtitles.us/en/opensubtitles-player.save-subtitles/sub/5048801

mahakaal

спасибо, я понял... я попробую этот метод..

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

С удовольствием. Добро пожаловать. :)

mahakaal

я проверил ссылку, но после загрузки пользователю придется вручную вернуться на страницу, с которой он сделал запрос.

после загрузки они не перезагружают страницу. они просто отправляют файл в браузер.

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

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

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

mahakaal

Спасибо Талит

Tadit Dash (ତଡିତ୍ କୁମାର ଦାଶ)

Добро пожаловать... А меня зовут Тадит :П