Как получить тело HttpRequest в ядре .net? - PullRequest
0 голосов
/ 23 октября 2018

Я хочу получить тело запроса Http в ядре .net, я использовал этот код:

using (var reader
    = new StreamReader(req.Body, Encoding.UTF8))
{
    bodyStr = reader.ReadToEnd();
}
req.Body.Position = 0

Но я получил эту ошибку:

System.ObjectDisposedException: Не удается получить доступудаленный объект.Имя объекта: 'FileBufferingReadStream'.

Произошла ошибка после оператора using строки

Как получить тело HttpRequest в ядре .net?и как исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Принятый ответ не сработал, но я дважды читал тело.

    public static string ReadRequestBody(this HttpRequest request, Encoding encoding)
    {
        var body = "";
        request.EnableRewind();

        if (request.ContentLength == null ||
            !(request.ContentLength > 0) ||
            !request.Body.CanSeek)
        {
            return body;
        }

        request.Body.Seek(0, SeekOrigin.Begin);

        using (var reader = new StreamReader(request.Body, encoding, true, 1024, true))
        {
            body = reader.ReadToEnd();
        }

        //Reset the stream so data is not lost
        request.Body.Position = 0;

        return body;
    }
0 голосов
/ 23 октября 2018

используя этот метод расширения для получения httpRequest Body:

   public static string GetRawBodyString(this HttpContext httpContext, Encoding encoding)
    {
        var body = "";
        if (httpContext.Request.ContentLength == null || !(httpContext.Request.ContentLength > 0) ||
            !httpContext.Request.Body.CanSeek) return body;
        httpContext.Request.EnableRewind();
        httpContext.Request.Body.Seek(0, SeekOrigin.Begin);
        using (var reader = new StreamReader(httpContext.Request.Body, encoding, true, 1024, true))
        {
            body = reader.ReadToEnd();
        }
        httpContext.Request.Body.Position = 0;
        return body;
    }

Важно то, что HttpRequest.Body является типом Stream. А когда StreamReader располагает, HttpRequest.Body также удаляется.

У меня была эта проблема, пока я не нашел следующую ссылку в github: см. Ссылку ниже и метод GetBody https://github.com/devdigital/IdentityServer4TestServer/blob/3eaf72f9e1f7086b5cfacb5ecc8b1854ad3c496c/Source/IdentityServer4TestServer/Token/TokenCreationMiddleware.cs

Если правильный, пометьте как правильный ответ.

...