У нас есть файл загрузки 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();
}
}