Это приложение на 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)