Bu soru daha önce birkaç formda sorulmuştur fakat işe yarayacak cevapları alamıyorum, saçlarımı kaybediyorum ve sorunun çözümlerin sadece 2 yıl önce olduğu ve şeylerin değiştiğinden emin olmadığından emin değilim. yöntem imzası çalışmaz, çünkü farklı bir Owin sürümünü gibi görünüyor -OWIN katman yazılımı bileşeni kullanarak MVC yanıt akışı nasıl denetlenir?
How can I safely intercept the Response stream in a custom Owin Middleware - bu çalışması gerekir gibi bu benim kod dayanarak, görünüyor, ama değil
OWIN OnSendingHeaders Callback - Reading Response Body yapar
Yapmak istediğim, yanıt akışını MVC'den inceleyebilen bir OMC yazmaktır.
Ben, bir MemoryStream için context.Response.Body ayarlayan bir OMC'yi eklemektir, bu yüzden geri sarmak ve mansap bileşenleri tarafından yazılmıştır neyi inceleyebilir (birkaç diğer girişimleri arasında) yaptığı şey:
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;
.......
Bulduğum şey, başka bir OMC'den yazmadığım sürece, MemoryStream öğesinin her zaman boş olmasıdır. Yani aşağı akım OMC'ler benim MemoryStream kullanıyor, ancak MVC yanıtları, istek MVC'ye gitmeden önce OWIN boru hattı tamamlanmış gibi değil, ama doğru değil mi?
Komple kodu: ben de sadece bu yüzden tuhaf dere ve yazılanları takip olabilir, response.Body akışı, bir Akış alt sınıfa ayarlanmış bir öneri çalıştı Ne değer için
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);
}
}
Stream.Write yöntemi çağrılır, ancak boş bir bayt dizisiyle, hiçbir zaman gerçek içerik ...