Необработанное исключение при загрузке веб-страницы с использованием HttpWebRequest и StreamReader - PullRequest
1 голос
/ 26 августа 2010

Это приложение на C #, использующее .NET 4.0.

Справочная информация:

Я пытался уточнить часть приложения, которая загружает файлы из нескольких веб-сайтов.сервера.Все работает довольно хорошо, за исключением случайной ситуации, когда удаленный компьютер закрывает соединение.Я предполагаю, что это может быть связано с различными факторами, включая проблемы с сетью, проблемы с питанием и т. Д. Я хотел бы просто пропустить загрузку в случае, если соединение закрывается.Однако в настоящее время приложение вызывает исключение, которое обрабатывается обработчиком для AppDomain.CurrentDomain.UnhandledException.Трассировка стека выглядит следующим образом:

Трассировка стека:

Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.
at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.IO.StreamReader.ReadBuffer() at System.IO.StreamReader.ReadToEnd()
at ProjectName.ClassNetwork.DownloadFile(String _IP, Int32 _Port, String _File)
at ProjectName.FormMain.GetIFile(ClassSensor Sensor, String& RawHolder, String[] FileData)
at ProjectName.FormMain.GetLegacyData(ClassSensor Sensor)
at ProjectName.FormMain.threader_Download(Object SensorObject)
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart(Object obj)

У меня изначально была попытка / отлов для WebException и Exception, но они не уловили этоконкретная ошибка.Я добавил внутреннюю попытку / поймать, чтобы избежать проблемы, но безрезультатно.Я должен упомянуть, что этот метод вызывается потоками, отличными от потока пользовательского интерфейса, что может быть отчасти причиной того, что блоки try / catch не работают.Простите, что я новичок, когда дело доходит до многопоточной ловли ошибок!

Вопрос:

  • Как я могу улучшить этот метод и правильно обрабатывать ситуации, когдасоединение не устанавливается в среднем потоке?

Код:

private static object[] DownloadFile(string _IP, int _Port, string _File)
{
    string uri = String.Format("http://{0}:{1}/{2}", _IP, _Port, _File);
    string Status = String.Empty;
    string Data = String.Empty;
    HttpWebResponse Response = null;

    try
    {
        HttpWebRequest webReq = (HttpWebRequest) WebRequest.Create(uri);
        webReq.Timeout = 10000;
        webReq.ReadWriteTimeout = 30000;
        Response = (HttpWebResponse) webReq.GetResponse();
        using (Stream dataStream = Response.GetResponseStream())
            if (dataStream != null)
                using (StreamReader reader = new StreamReader(dataStream))
                    try
                    {
                        // This line causes crashes if remote computer closes connection
                        Data = reader.ReadToEnd();
                    }
                    catch { } // Inner try/catch added to no avail
        Response.Close();
    }
    catch (WebException exc)
    {
        // Connection Error
        Status = exc.Status.ToString();
        Data = String.Empty;
    }
    catch (Exception exc)
    {
        // Other error
        Status = exc.Message;
        Data = String.Empty;
    }

    if (Response != null && Response.StatusCode != HttpStatusCode.OK)
    {
        Status = Response.StatusCode.ToString();
        Data = String.Empty;
    }

    return new object[] { Status, Data };
}

Журнал трассировки:

ВПо предложению Фероза, я провел трассировку, и вот результат:

System.Net Error: 0 : [2164] Exception in the
#46104728::UnhandledExceptionHandler - Stream was not readable.
System.Net Error: 0 : [2164]     at System.IO.BinaryReader..ctor(Stream input, Encoding encoding)
at ProjectName.ClassNetwork.DLStream(ClassSensor Sensor)
at ProjectName.ClassNetwork.DownloadFile(ClassSensor Sensor)
at ProjectName.FormMain.GetStreamFile(ClassSensor Sensor)
at ProjectName.FormMain.threader_Download(Object SensorObject)
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncctx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart(Object obj)

1 Ответ

1 голос
/ 30 августа 2010

Из стека я не вижу, как это исключение выдается потоком потоков, который вы не можете перехватить.Очевидно, из стека кажется, что он был вызван методом ConnectStream :: Read, который был вызван в потоке вашего приложения.

...