HttpContext.Response.Body.Position = 0 - ошибка «Указанный метод не поддерживается» - PullRequest
0 голосов
/ 03 июля 2018

У меня есть некоторое промежуточное программное обеспечение для регистрации, которое я настраиваю, чтобы получать и регистрировать информацию, используя HttpContext.

Мне нужно установить позицию HttpResponse.Body в 0, чтобы прочитать весь поток, однако, независимо от того, что я пытаюсь, он выдает «Указанный метод не поддерживается» и завершается ошибкой.

Это очень странно для меня, потому что позиция встроена прямо в HttpResponse.Body, и я использовал ее раньше успешно.

Я также пытался использовать HttpResponse.Body.Seek с тем же результатом.

На данный момент я застрял, любая помощь будет оценена.

ОБНОВЛЕНИЕ: я смог изменить положение response.body после перемещения его в новый поток памяти, однако теперь он возвращает пустое тело обратно.

public async Task Invoke(HttpContext context)
        {
            //Retrieve request & response
            var request = context.Request;
            var response = context.Response;

            if (request.Path != "/")
            {
                var reqBody = request.Body;
                var resBody = response.Body;
                string path = request.Path;
                string method = request.Method;
                string queryString = HttpUtility.UrlDecode(request.QueryString.ToString());
                int statusCode = context.Response.StatusCode;

                var buffer = new byte[Convert.ToInt32(request.ContentLength)];
                await request.Body.ReadAsync(buffer, 0, buffer.Length);
                var reqBodyText = Encoding.UTF8.GetString(buffer);
                request.Body = reqBody;

                var responseBodyStream = new MemoryStream();
                context.Response.Body = responseBodyStream;

                await _next(context);

                responseBodyStream.Seek(0, SeekOrigin.Begin);
                var resBodyText = new StreamReader(responseBodyStream).ReadToEnd();
                responseBodyStream.Seek(0, SeekOrigin.Begin);
                await responseBodyStream.CopyToAsync(context.Response.Body);

                ...
            }
        }

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Я смог решить это:

Во-первых, я устанавливаю ответ для его собственного потока памяти и вызываю await _next (context) после того, как поток был установлен:

var responseBodyStream = new MemoryStream();
context.Response.Body = responseBodyStream;

await _next(context);

Затем, как только я это сделал, я заметил, что получаю пустое тело обратно, это было из-за попытки установить пустое тело обратно в качестве контекста ответа:

await responseBodyStream.CopyToAsync(context.Response.Body);

Я удалил эту строку, и все стало работать правильно.

0 голосов
/ 06 июня 2019

Я столкнулся с этой проблемой сегодня в своем основном API-интерфейсе Asp.Net.

enter image description here

Проблема была в том, что я забыл добавить параметр [FromBody] в мой API. После добавления, как показано ниже, проблема была решена.

[HttpPost("merkliste/create")]
public virtual async Task<IActionResult> MerklisteWorksheetCreate(string worksheetName, [FromBody] string elementDetailsArray)

enter image description here

Надеюсь, это поможет.

0 голосов
/ 03 июля 2018

Вы, вероятно, получаете доступ к телу ответа, прежде чем оно будет готово. Отложить выполнение вызова задачи (контекст HttpContext) до более позднего шага (когда он будет готов) в конвейере выполнения

...