无法使用通用处理程序下载文件
Unable to dowload file using generic handler
我正在使用通用处理程序下载 csv/excel 文件。直到昨天它工作正常。今天它突然停止在 IIS 7.5 上进行部署(尽管他的相同代码在 visual studio 调试模式下运行良好)。这是我的代码:
ASPX:这是一个内容页面
<input type="button" class="btn-primary" id="btnDownload" title="Download" value="Download" onclick='return downloadReport(this);' data-toggle="modal" data-target="#myModal" navurl='<%: ResolveUrl("~/Handlers/DownloadData.ashx") %>' />
JS:
function downloadReport(btn) {
//I am using a kendoUI combo box and kendo js + also using bootstrap for design & modal popups & also i have applied bundling to kendo & bootstrap files. They seem to be working fine without any conflicts as all their api's are working.
var $mod = $("#masterModal");
$mod.modal('show');
//window.location = "Handlers/DownloadData.ashx?rtp=" + combobox.val();
window.location.href = $(btn).attr("navurl") + "?rtp=" + combobox.val();
setTimeout(function () {
$mod.modal("hide");
}, 2000);
return false;
}
主页:
我将包含上述方法的 js 文件包含在正文标记结束之前。
<script src='<%: ResolveUrl("~/Scripts/DataUploader.js") %>'></script>
</body>
</html>
处理程序:在处理程序中处理请求方法
HttpResponse response = this._context.Response;
HRReportData hrData = new HRReportData(ConfigMaster.DbProvider, ConfigMaster.ConnectionString, ConfigMaster.DBSchemaName);
ReportDataManager rdm = null;
ExcelPackage xlPackage = null;
try
{
rdm = new ReportDataManager();
DataSet ds = rdm.GetReportData(hrData, report_Type);
if (ds != null && ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
xlPackage = new ExcelPackage();
ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.Add(report_Type.ToString());
worksheet.Cells["A1"].LoadFromDataTable(ds.Tables[0], true, TableStyles.Light1);
response.ClearHeaders();
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AppendHeader("content-disposition", "attachment; filename=" + report_Type.ToString() + ".xlsx");
xlPackage.SaveAs(response.OutputStream);
response.Flush();
//response.Close();
//response.End();
}
}
}
catch (Exception ex)
{
//LogError.MethodLevelError(Convert.ToString(Session["Username"]), ex);
if (!(ex is System.Threading.ThreadAbortException))
{
//Other error handling code here
}
}
finally
{
if (xlPackage != null)
{
xlPackage.Dispose();
xlPackage.Dispose();
}
}
捆绑包配置:
bundles.Add(new ScriptBundle("~/Kendo/kendo").Include(
"~/Scripts/jquery-1.11.3.min.js",
"~/Kendo/js/kendo.all.min.js"
// "~/Scripts/DataUploader.js"
));
bundles.Add(new ScriptBundle("~/bootstrap/bootstrap").Include(
"~/bootstrap/js/holder.js",
"~/bootstrap/js/ie10-viewport-bug-workaround.js",
"~/bootstrap/js/ie-emulation-modes-warning.js",
"~/bootstrap/js/bootstrap.min.js"
));
以上所有代码在调试模式下运行良好,在部署模式下也运行良好。不知道发生了什么变化,它突然停止工作,我无法找出任何原因:(
部署时的行为:它没有停留在同一页面并下载文件,而是导航到处理程序并显示空白屏幕。没有文件下载。
调试模式下的行为或 运行 使用 vs2012 express 时的行为:它停留在同一页面并按预期下载文件。
有人请帮助我。
以上所有代码都可以 100% 正常工作。这其中绝对没有错误。我发现它不起作用的原因是已发布文件夹中的 web.config 不是某人 updated/overwritten 并且由于工作处于开始阶段我还没有添加对 Exception [=15= 的支持] 日志记录因此处理程序错误(由于访问配置文件中使用的密钥)未被注意到并且在 debug/dev 环境中配置文件是正确的因此从未发生错误。
无论如何,该代码对于希望使用通用处理程序下载文件的任何人都是有用的。但是请注意,上面的代码处于基础阶段,需要更新为:
1)用户请求验证-参数验证
2)用户会话验证
3)安全实施
4)异常处理
5) 记录
我正在使用通用处理程序下载 csv/excel 文件。直到昨天它工作正常。今天它突然停止在 IIS 7.5 上进行部署(尽管他的相同代码在 visual studio 调试模式下运行良好)。这是我的代码:
ASPX:这是一个内容页面
<input type="button" class="btn-primary" id="btnDownload" title="Download" value="Download" onclick='return downloadReport(this);' data-toggle="modal" data-target="#myModal" navurl='<%: ResolveUrl("~/Handlers/DownloadData.ashx") %>' />
JS:
function downloadReport(btn) {
//I am using a kendoUI combo box and kendo js + also using bootstrap for design & modal popups & also i have applied bundling to kendo & bootstrap files. They seem to be working fine without any conflicts as all their api's are working.
var $mod = $("#masterModal");
$mod.modal('show');
//window.location = "Handlers/DownloadData.ashx?rtp=" + combobox.val();
window.location.href = $(btn).attr("navurl") + "?rtp=" + combobox.val();
setTimeout(function () {
$mod.modal("hide");
}, 2000);
return false;
}
主页:
我将包含上述方法的 js 文件包含在正文标记结束之前。
<script src='<%: ResolveUrl("~/Scripts/DataUploader.js") %>'></script>
</body>
</html>
处理程序:在处理程序中处理请求方法
HttpResponse response = this._context.Response;
HRReportData hrData = new HRReportData(ConfigMaster.DbProvider, ConfigMaster.ConnectionString, ConfigMaster.DBSchemaName);
ReportDataManager rdm = null;
ExcelPackage xlPackage = null;
try
{
rdm = new ReportDataManager();
DataSet ds = rdm.GetReportData(hrData, report_Type);
if (ds != null && ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
xlPackage = new ExcelPackage();
ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.Add(report_Type.ToString());
worksheet.Cells["A1"].LoadFromDataTable(ds.Tables[0], true, TableStyles.Light1);
response.ClearHeaders();
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AppendHeader("content-disposition", "attachment; filename=" + report_Type.ToString() + ".xlsx");
xlPackage.SaveAs(response.OutputStream);
response.Flush();
//response.Close();
//response.End();
}
}
}
catch (Exception ex)
{
//LogError.MethodLevelError(Convert.ToString(Session["Username"]), ex);
if (!(ex is System.Threading.ThreadAbortException))
{
//Other error handling code here
}
}
finally
{
if (xlPackage != null)
{
xlPackage.Dispose();
xlPackage.Dispose();
}
}
捆绑包配置:
bundles.Add(new ScriptBundle("~/Kendo/kendo").Include(
"~/Scripts/jquery-1.11.3.min.js",
"~/Kendo/js/kendo.all.min.js"
// "~/Scripts/DataUploader.js"
));
bundles.Add(new ScriptBundle("~/bootstrap/bootstrap").Include(
"~/bootstrap/js/holder.js",
"~/bootstrap/js/ie10-viewport-bug-workaround.js",
"~/bootstrap/js/ie-emulation-modes-warning.js",
"~/bootstrap/js/bootstrap.min.js"
));
以上所有代码在调试模式下运行良好,在部署模式下也运行良好。不知道发生了什么变化,它突然停止工作,我无法找出任何原因:(
部署时的行为:它没有停留在同一页面并下载文件,而是导航到处理程序并显示空白屏幕。没有文件下载。
调试模式下的行为或 运行 使用 vs2012 express 时的行为:它停留在同一页面并按预期下载文件。
有人请帮助我。
以上所有代码都可以 100% 正常工作。这其中绝对没有错误。我发现它不起作用的原因是已发布文件夹中的 web.config 不是某人 updated/overwritten 并且由于工作处于开始阶段我还没有添加对 Exception [=15= 的支持] 日志记录因此处理程序错误(由于访问配置文件中使用的密钥)未被注意到并且在 debug/dev 环境中配置文件是正确的因此从未发生错误。
无论如何,该代码对于希望使用通用处理程序下载文件的任何人都是有用的。但是请注意,上面的代码处于基础阶段,需要更新为: 1)用户请求验证-参数验证 2)用户会话验证 3)安全实施 4)异常处理 5) 记录