Asp.net mvc 将文件流式传输到MVC控制器时无法捕获HttpWebRequest异常
我有一个MVC控制器操作,我正在向其发布一个文件流:-Asp.net mvc 将文件流式传输到MVC控制器时无法捕获HttpWebRequest异常,asp.net-mvc,http-streaming,Asp.net Mvc,Http Streaming,我有一个MVC控制器操作,我正在向其发布一个文件流:- public ActionResult Upload() { try { HttpPostedFileBase files = Request.Files[0]; Stream fileStream = files.InputStream; String url = ConfigurationManager.AppSettings[ConfigurationParams.Se
public ActionResult Upload()
{
try
{
HttpPostedFileBase files = Request.Files[0];
Stream fileStream = files.InputStream;
String url = ConfigurationManager.AppSettings[ConfigurationParams.ServiceGatewayURI];
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.AllowWriteStreamBuffering = false;
request.Timeout = 86400000;
request.ContentType = "application/json";
request.ContentLength = fileStream.Length;
Stream outputStream = request.GetRequestStream();
int BYTELENGTH = 1024;
byte[] chunk = new byte[BYTELENGTH];
while (fileStream.Position < fileStream.Length)
{
int len = fileStream.Read(chunk, 0, BYTELENGTH);
outputStream.Write(chunk, 0, len);
}
fileStream.Close();
fileStream.Dispose();
outputStream.Close();
outputStream.Dispose();
return Json("");
}
catch (Exception ex)
{
return Json(new { error = String.Format("Exception when streaming to back end, {0}"),ex.Message });
}
}
我面临的挑战是,当SaveFile方法中发生异常时,它不会返回到Upload控制器调用。上传控制器仍然幸福地不知道在保存文件时出现了问题
在使用Fiddler进行调试时,我可以看到两个独立的流,包括SaveFile方法中的HTTP 500错误
我的问题是如何将异常从SaveFile方法抛出到Upload控制器?我曾尝试在引发异常时关闭后端的inputStream,但上传调用没有返回500
谢谢。谢谢,成功了。如果不调用GetResponse,您似乎无法获得异常的句柄。我一添加行,异常就被主try-catch捕获 我必须阅读ResponseStream才能获得全部细节,但目前这个解决方案已经足够有效了
try
{
HttpWebResponse theResponse = (HttpWebResponse)request.GetResponse();
theResponse.Close();
}
catch (WebException wex)
{
return Json(new { error = wex.Message});
}
“然后将inputStream发布到API控制器方法”…您是如何做到这一点的?您如何处理由此产生的异常或HTTP错误代码?这似乎是关键所在,但您却没有考虑这些代码。如果API正确返回500个错误,那么这一切都取决于如何在Upload()方法中处理该错误。我们可以看到您正在编写
outputStream
,但我不相信这会真正触发HTTP请求启动,或者真的启动了?感谢ADyson的评论。使用Fiddler进行调试,我可以看到从浏览器到Upload controller方法的HTTP连接在第一个大括号被点击时立即打开。在单步执行代码并到达Stream outputStream=request.GetRequestStream()时;POST与API控制器的连接打开。上载控制器连接以200结束,API连接以500结束。我想try-and-catch会处理任何异常,因为outputStream行在其中。没问题……你能回答我的问题吗?当然,请参见上文。我没有使用这个特定的库来发出HTTP请求,但我认为您可能需要使用GetResponse来侦听响应:-根据文档,如果发生错误,它将抛出WebException
try
{
HttpWebResponse theResponse = (HttpWebResponse)request.GetResponse();
theResponse.Close();
}
catch (WebException wex)
{
return Json(new { error = wex.Message});
}