To pytanie zostało zadane wcześniej w kilku postaciach, ale nie mogę uzyskać żadnej z odpowiedzi do pracy, tracę włosy i nie wiem, czy problem polega tylko na tym, że rozwiązania były sprzed 2 lat, a sytuacja się zmieniła.Jak sprawdzić strumień odpowiedzi MVC za pomocą komponentu oprogramowania warstwy pośredniej OWIN?
How can I safely intercept the Response stream in a custom Owin Middleware - Oparłem mój kod na to, że wygląda jak to powinno działać, ale nie
OWIN OnSendingHeaders Callback - Reading Response Body - wydaje się być inną wersję OWIN, ponieważ podpis metoda nie działa
Co chcę zrobić, to napisać OMK, która może kontrolować strumień odpowiedzi z MVC.
Co zrobiłem (wśród kilku innych prób), jest dodanie OMK, który ustawia context.Response.Body do MemoryStream, więc mogę przewinąć go i sprawdzić, co zostało napisane przez dalszych komponentów:
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;
.......
Co mogę znaleźć, to że MemoryStream jest zawsze pusty, chyba że piszę do niego z innej OMC. Wygląda więc na to, że kolejne OMC używają mojego MemoryStream, ale odpowiedzi MVC nie są, tak jakby potok OWIN zakończył się zanim zapytanie trafi do MVC, ale to nie jest prawda?
Kompletny kod:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.Use(new ResponseExaminerMiddleware());
// Specify the stage for the OMC
//app.UseStageMarker(PipelineStage.Authenticate);
}
}
public class ResponseExaminerMiddleware
{
private AppFunc next;
public void Initialize(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();
// Now, you can access response body.
System.Diagnostics.Debug.WriteLine(responseBody);
// You need to do this so that the response we buffered
// is flushed out to the client application.
buffer.Seek(0, SeekOrigin.Begin);
await buffer.CopyToAsync(stream);
}
}
Na co warto Próbowałem też sugestię, gdzie strumień response.Body jest ustawiony na podklasy Stream, tak więc mogłem kontrolować, co jest napisane do strumienia i dziwnie Wywoływana jest metoda Stream.Write, ale z pustą tablicą bajtów, nigdy aktualna treść ...