System.Net.WebException: основное соединение было закрыто ->. System.IO.IOException: невозможно прочитать данные из транспортного соединения - PullRequest
0 голосов
/ 28 марта 2019

У нас есть файл загрузки RestApi на производстве. Внутренне UploadFile вызывает другой API (FileHandlerServlet) для сохранения фотографии на физическом диске. Вчера мы получили огромное количество исключений в нашем API REST UploadFile. Исключение объясняет

System.Net.WebException: базовое соединение было закрыто: при получении произошла непредвиденная ошибка. --- System.IO.IOException: невозможно прочитать данные из транспортного соединения: Существующее соединение было принудительно закрыто удаленным хостом. ---> System.Net.Sockets.SocketException: существующее соединение было принудительно закрыто удаленным хостом в System.Net.Sockets.NetworkStream.Read (буфер Byte [], смещение Int32, размер Int32) --- Конец внутренней трассировки стека исключений --- в System.Net.Sockets.NetworkStream.Read (буфер Byte [], смещение Int32, размер Int32) в System.Net.PooledStream.Read (буфер Byte [], смещение Int32, размер Int32) в System.Net.Connection.SyncRead (запрос HttpWebRequest, логический userRetrievedStream, логический probeRead) --- Конец внутренней трассировки стека исключений --- в System.Net.HttpWebRequest.GetRequestStream (TransportContext & context) в System.Net.HttpWebRequest.GetRequestStream () в Photos.WebApis.Utilities.Helper.UploadFilesToRemoteUrl (URL-адрес строки, Byte [] img) в D: \ Source \ Person \ Photos \ Photos.WebApis \ Utilities \ Helper.cs: строка 60 в Photos.WebApis.Controllers.AddPersonalPhotoController.POST (запрос HttpRequestMessage, фотография DtoPersonalPhoto) в D: \ Source \ Person \ Photos \ Photos.WebApis \ Controllers \ AddPersonalPhotoController.cs: строка 102

На первый взгляд кажется, что существует какая-то проблема, когда API UploadFile взаимодействует с FileHandlerServlet. На этом уровне мы можем либо взломать FileHandlerServlet, либо Network. Но это не так. Потому что, когда команда Network перезапустила IIS API UploadFile, все работало нормально. Api разработаны в MVC5, .Net framework 4.6.1. Мой вопрос "Может ли быть какая-либо проблема с IIS, пулом приложений и т. Д."?

Эта проблема произошла только один раз. Обычно UploadFile API обрабатывает 10K + записей ежедневно.

Вот пример кода

public string UploadFilesToRemoteUrl(string url, byte[] img)
    {
        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ContentType = "multipart/form-data; boundary=" + boundary;
        request.Method = "POST";
        request.UseDefaultCredentials = false;
        request.PreAuthenticate = true;

        var FileServerUserName = WebConfigurationManager.AppSettings["FileUserName"].ToString();
        var FileServerPwd = WebConfigurationManager.AppSettings["FilePwd"].ToString();
        request.Credentials = new NetworkCredential(FileServerUserName, FileServerPwd);

        var boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
        var endBoundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");
        string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
        string headerTemplate =
            "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
            "Content-Type: application/octet-stream\r\n\r\n";

        Stream memStream = new MemoryStream();
        memStream.Write(boundarybytes, 0, boundarybytes.Length);
        var header = string.Format(headerTemplate, "uplTheFile", "MyyyPic");
        var headerbytes = Encoding.UTF8.GetBytes(header);
        memStream.Write(headerbytes, 0, headerbytes.Length);
        memStream.Write(img, 0, img.Length);
        memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
        request.ContentLength = memStream.Length;

        using (Stream requestStream = request.GetRequestStream())
        {
            memStream.Position = 0;
            byte[] tempBuffer = new byte[memStream.Length];
            memStream.Read(tempBuffer, 0, tempBuffer.Length);
            memStream.Close();
            requestStream.Write(tempBuffer, 0, tempBuffer.Length);
        }
        using (var response = request.GetResponse())
        {
            Stream stream2 = response.GetResponseStream();
            StreamReader reader2 = new StreamReader(stream2);
            return reader2.ReadToEnd();
        }
    }
...