背景信息:
在我的asp.net(.NET目标框架是4.6.1)应用程序中,我使用dropzone.js客户端上传文件。处理上传的服务器端代码包含在try / catch中。抛出异常时,应捕获,记录错误,将响应状态代码设置为500
,"An error occurred"
应写入响应,最后调用Response.End()
。
我有两个不同的环境,我正在运行此应用程序。第一个是我的开发环境(Windows 10 Pro,应用程序在IIS 10的本地实例上运行)。第二个是我的UAT环境(带有Windows Server 2012 R2的Azure VM,应用程序在IIS 8.5上运行)。
问题:
当发生异常时(在try / catch内部),我的浏览器收到的响应在Dev和UAT之间是不同的。
在Dev 中,响应为纯文本An error occurred
。
在UAT 中,响应看起来像是来自IIS错误页面的原始HTML(这是由dropzone捕获并在错误气泡中显示得非常糟糕)。
代码
我的dropzone.js前端代码(为了完整起见,我不相信问题在这里):
$("#attachDZ").dropzone({
url: "/file/upload.aspx",
maxFilesize: 1024,
dictDefaultMessage: "Drop files here or click to upload."
});
这是后端代码(位于Page_Load
的{{1}}):
upload.aspx.cs
在Dev和UAT的web.config中,我有try
{
// Get the data
foreach (string pf in Request.Files)
{
HttpPostedFile postedfile = (HttpPostedFile)Request.Files[pf];
string strFileName = Path.GetFileName(postedfile.FileName);
Byte[] UploadBytes = new Byte[postedfile.ContentLength];
postedfile.InputStream.Read(UploadBytes, 0, postedfile.ContentLength);
tTempAtt file = tTempAtt.NewInstance();
file.ContentType = postedfile.ContentType;
file.File = UploadBytes;
file.FileName = strFileName;
file.Insert();
}
}
catch (Exception ex)
{
LogProxy.WriteError(ex);
Response.StatusCode = 500;
Response.Write("An error occurred");
}
finally
{
Response.End();
}
。我完全难以理解这两种环境之间的区别是什么,即使抛出的异常相同,也会导致响应不同。
看来,在UAT中,<customErrors mode="Off"/>
被忽略(这不可能,对吧?)。我在Dev环境中删除了catch
/ try
并强制执行异常,并且能够重现与UAT中相同的结果。在没有删除catch
/ try
的情况下,我无法在Dev环境中重现该问题...即使我构建了发布模式并将web.config中的debug标志设置为{{ 1}}。
有没有人有任何想法?我试图包含最相关的信息,但如果还有其他我错过的内容,请告诉我。任何帮助将不胜感激。