Ответ формата промежуточного программного обеспечения - PullRequest
1 голос
/ 03 апреля 2019

Использование .NET Core, C #.

Я добавил промежуточное ПО при запуске, чтобы можно было форматировать ответы об ошибках << Это работает!Но, к сожалению, я почему-то потерял ответ, когда он не является ошибкой.Нужно ли читать ответ, а затем записывать ответ обратно? </p>

public async Task Invoke(HttpContext context)
    {
        var body = context.Response.Body;

        using (var newBody= new MemoryStream())
        {
            context.Response.Body = newBody;

            await _next(context);
            if (context.Response.StatusCode != 200 && context.Response.StatusCode != 206)
            {
                context.Response.Body = body;
                updatedBody.Seek(0, SeekOrigin.Begin);
                var msg= new StreamReader(updatedBody).ReadToEnd();

                if (msg.Length > 0) {
                    context.Response.ContentType = _messageParser.GetFormat();
                    var response = _messageParser.MakeItPretty(msg);
                    await context.Response.WriteAsync(response);
                }
            }
        }
}

1 Ответ

1 голос
/ 04 апреля 2019

Это потому, что вы располагаете newBody, поэтому, когда ответ не является ответом об ошибке, тогда все тело ответа удаляется и теряется. Вы можете создать else заявление и скопировать ответ в оригинал body:

if (context.Response.StatusCode != 200 && context.Response.StatusCode != 206)
{
    ...
}
else
{
    context.Response.Body = body;
    newBody.Seek(0, SeekOrigin.Begin);
    await newBody.CopyTo(context.response.Body);
}

Или мое личное предпочтение - создать собственный ErrorResult, который реализует IActionResult или наследует ObjectResult, где Вы можете форматировать сообщение, используя ваш объект вместо строки:

public class ErrorResult : ObjectResult
{
    public ErrorResult(MyError error)
        : base(error)
    {
        StatusCode = 400;
    }

    public override Task ExecuteResultAsync(ActionContext context)
    {
        var messageParser = context.HttpContext.RequestServices.GetService(typeof(IMessageParser));
        ContentTypes.Add(messageParser.GetFormat());

        <other modifications>

        return base.ExecuteResultAsync(context);
    }

и затем вернуть его в контроллеры

...
return new ErrorResult(new MyError(...));
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...