Тело ответа не изменяется после обработки промежуточным ПО - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь написать промежуточное программное обеспечение, которое вызывает следующее промежуточное программное обеспечение, и затем, каким бы ни было тело ответа этого промежуточного программного обеспечения, оно будет изменено моим промежуточным программным обеспечением.

Это то, что метод Configuration() вStartup класс выглядит так:

public void Configuration(IAppBuilder app)
{
    app.Use<OAuthAuthenticationFailCustomResponse>();
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}


Это промежуточное программное обеспечение, написанное мной:

public class OAuthAuthenticationFailCustomResponse : OwinMiddleware
{
    public OAuthAuthenticationFailCustomResponse(OwinMiddleware next)
        : base(next)
    {
    }

    public async override Task Invoke(IOwinContext context)
    {
        var stream = context.Response.Body;

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

            await Next.Invoke(context);

            buffer.Seek(0, SeekOrigin.Begin);

            var byteArray = Encoding.ASCII.GetBytes("Hello World");
            context.Response.StatusCode = 200;
            context.Response.ContentLength = byteArray.Length;

            buffer.SetLength(0);
            buffer.Write(byteArray, 0, byteArray.Length);
            buffer.Seek(0, SeekOrigin.Begin);
            buffer.CopyTo(stream);
        }
    }
}


Однако я все еще получаю ответ OAuthBearerAuthentication промежуточное программное обеспечение после вызова API, которое:

{"Сообщение": "Авторизация отклонена для этого запроса".}


Здесь я научился писать код, который изменяет тело ответа;

1 Ответ

0 голосов
/ 01 января 2019

Исходный поток не был возвращен в тело ответа контекста

public async override Task Invoke(IOwinContext context) {
    // hold a reference to what will be the outbound/processed response stream object 
    var stream = context.Response.Body;

    // create a stream that will be sent to the response stream before processing
    using (var buffer = new MemoryStream()) {
         // set the response stream to the buffer to hold the unaltered response
        context.Response.Body = buffer;

        // allow other middleware to respond
        await Next.Invoke(context);

        // we have the unaltered response, go to start
        buffer.Seek(0, SeekOrigin.Begin);

        // read the stream from the buffer
        var reader = new StreamReader(buffer);
        string responseBody = reader.ReadToEnd();

        //...decide what you want to do with the responseBody from other middleware

        //custom response
        var byteArray = Encoding.ASCII.GetBytes("Hello World");

        //write custom response to stream
        stream.Write(byteArray, 0, byteArray.Length);

        //reset the response body back to the original stream
        context.Response.Body = stream;
        context.Response.StatusCode = 200;
        context.Response.ContentLength = byteArray.Length;
    }
}
...