Owin context.Response. Тело всегда пустое - PullRequest
0 голосов
/ 04 сентября 2018

прошли через некоторые примеры и создали новый буфер MemoryStream для замены Response.Body перед вызовом next ().

Ниже мое промежуточное ПО:

public class TrackingMiddleware
{
    private readonly AppFunc next;

    public TrackingMiddleware(AppFunc next)
    {
        this.next = next;
    }

    public async Task Invoke(IDictionary<string, object> env)
    {
        IOwinContext context = new OwinContext(env);

        // Buffer the response
        var stream = context.Response.Body;
        var buffer = new MemoryStream();
        context.Response.Body = buffer;

        await this.next(env);

        buffer.Seek(0, SeekOrigin.Begin);
        var reader = new StreamReader(buffer);
        string responseBody = await reader.ReadToEndAsync();

        buffer.Seek(0, SeekOrigin.Begin);
        await buffer.CopyToAsync(stream);
    }
}

responseBody всегда пуст, событие Action моего ApiController вернул Список данных.

Ниже мой класс стартапов в Оуэне (я что-то пропустил?)

public partial class Startup
{
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    static Startup()
    {
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/token"),
            Provider = new OAuthAppProvider(),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(2),
            AllowInsecureHttp = true
        };
    }

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseOAuthBearerTokens(OAuthOptions);

        app.Use<TrackingMiddleware>();
    }
}

Ниже мой ApiController

public class TestController : ApiController
{

    public IHttpActionResult Get()
    {
        return Json(new string[] {"123", "asdfsdf"});
    }
}

и конфигурация My Web api зарегистрирована через Global.asax.cs

public class WebApiApplication : System.Web.HttpApplication
{

    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

Это причина, которая испортила последовательность промежуточного программного обеспечения?

В качестве альтернативы, если я использую метод MVC и он работает с HttpContext.Current.Response, ссылаясь на следующий sample

1 Ответ

0 голосов
/ 04 сентября 2018

Вы должны поместить исходный поток обратно в ответ

context.Response.Body = stream;

Таким образом, он может быть прочитан предыдущим промежуточным ПО в конвейере

Вы также хотели бы избавиться от любых ресурсов, которые больше не нужны

public async Task Invoke(IDictionary<string, object> env) {
    IOwinContext context = new OwinContext(env);

    // Buffer the response
    var stream = context.Response.Body;
    using (var buffer = new MemoryStream()) {
        context.Response.Body = buffer;

        //call next in pipeline
        await this.next(env);

        //reset the original response body
        context.Response.Body = stream;

        //get data from buffer
        buffer.Seek(0, SeekOrigin.Begin);
        var reader = new StreamReader(buffer);
        string responseBody = await reader.ReadToEndAsync();    
        buffer.Seek(0, SeekOrigin.Begin);

        //put data into original stream to continue the flow.
        await buffer.CopyToAsync(stream);
    }

}
...