我查看了所有可能的答案,但没有任何可以让我找到解决这个不稳定问题的解决方案。
在我工作的MVC5 Web应用程序中,一些用户可以下载按下下载按钮时生成的Excel文件。在编写本文时,Web应用程序不会将文件存储在服务器上。因此,用户需要等到它完成才能将其视为成功下载的文件。
我将粘贴下面的代码。问题是下载方法创建了一个
500 - 连接超时
如果它似乎是很长一段时间以来第一次没有被击中这个方法。如果用户按下浏览器后退按钮并再次执行此操作,则下载时间将非常短,如果没有人下载他们的Excel文件,问题将在几小时后回来。
当连接超时时,我收到了错误报告。第一个是:
System.Web.HttpException:远程主机关闭了连接。该 错误代码是0x800704CD。生成:太阳,2016年11月27日16:33:58 GMT
System.Web.HttpException(0x800704CD):远程主机关闭了 连接。错误代码是0x800704CD。在 System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(的Int32 结果,布尔throwOnDisconnect)at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()at System.Web.HttpResponse.Flush(布尔值finalFlush,布尔异步)at System.Web.HttpResponse.Flush()at System.Web.HttpResponseWrapper.Flush()
第二个是:
System.Web.HttpException:服务器无法在HTTP之后追加标头 标题已发送。生成:太阳,2016年11月27日16:33:58 GMT
System.Web.HttpException(0x80004005):服务器无法追加标头 发送HTTP标头后。在 System.Web.HttpResponse.AppendHeader(String name,String value)at System.Web.HttpResponseWrapper.AppendHeader(String name,String value) 在System.Web.Mvc.MvcHandler.AddVersionHeader(HttpContextBase) httpContext) System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController&控制器,IControllerFactory&厂)
在System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase) httpContext,AsyncCallback回调,对象状态)at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback回调,对象状态)
以下是代码:
[HttpPost]
public async Task<EmptyResult> Export(ExcelViewModel vModel)
{
/*
* Note:
* Update the download date to keep track on new entries.
*/
var fileName = string.Empty;
var fileStream = await Task.Run(async () =>
{
var e = await _eventService.FindAsync(base.UserLanguageId, int.Parse(vModel.EventId));
var orders = _orderSKUDiscountService.GetMembershipsByConfirmedOrders(base.AuthenticatedUser.Id, e.Slug, "");
var lots = _lotService.GetLotByEventWihRecipient(e.Id).ToList();
var stream = PushDataToExcel(lots, orders, DateTimeUtility.GetTimeFromUtc(e.LatestExcelDownloadDateUtc.Value));
if (stream != null)
{
e.LatestExcelDownloadDateUtc = DateTime.UtcNow;
if (await _unitOfWorkAsync.SaveChangesAsync() > 0)
{
fileName = Tools.StripAccent(e.Name) + "-rapport";
return stream;
}
}
return new MemoryStream();
});
// Write it back to the client
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xlsx", fileName));
Response.OutputStream.Write(fileStream.GetBuffer(), 0, (int)fileStream.Length);
Response.Flush();
Response.End();
fileStream.Close();
return new EmptyResult();
}
总而言之,这是一个MVC5 C#Web应用程序,Azure上的主机,带有S0数据库。我尝试通过在上面的代码中看到的 FindByAsync 和 GetMembershipsByConfirmedOrders 之前和之后放置一个长Tread.Sleep来重现问题,这些是对数据库的请求,但我从来没有把连接超时。所以我对如何解决它感到有些困惑。
谢谢
大卫