Asp.net mvc 将文件流式传输到MVC控制器时无法捕获HttpWebRequest异常

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

我有一个MVC控制器操作,我正在向其发布一个文件流:-

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});
}