Почему я должен читать inputStream в методе Global.asax Application_BeginRequest, передавая контроллеру? - PullRequest
0 голосов
/ 01 мая 2019

У меня большое тело JSON, отправляемое в конечную точку приложения .NET MVC.Конечная точка всегда будет успешно выполнена с первого раза.В следующий раз, когда я использую конечную точку, я получу:

System.Web.HttpException (0x80004005): Произошла ошибка при соединении с удаленным хостом.Код ошибки 0x800703E5.---> System.Runtime.InteropServices.COMException (0x800703E5): выполняется операция ввода-вывода с перекрытием.(Исключение из HRESULT: 0x800703E5)

Если я перезагружаю IIS, проблема исчезает только для 1 запроса.Если я ПРОЧИТАЮ inputStream в файле Global.Asax.cs, проблема исчезнет.

Вот подпись метода в контроллере:

public async Task<HttpResponseMessage> Post(int personId, int visitId, int documentId, [FromBody]StoredDocumentDetails value, string locale = null)

Вот метод Global.asax.cs:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        if (application != null && application.Context != null)
        {
            application.Context.Response.Headers.Remove("Server");
        }
        if (Log.IsDebugEnabled() && application != null)
        {

            var requestBytes = new byte[application.Request.InputStream.Length];
            var currentPosition = application.Request.InputStream.Position;
            application.Request.InputStream.Read(requestBytes, 0, requestBytes.Length);
            application.Request.InputStream.Position = currentPosition;
            var requestBody = Encoding.UTF8.GetString(requestBytes);
            Log.DebugFormat("Incoming Request Body: {0}", requestBody);
        }
    }
...