मैं एएसपी.NET कोर एक्शन से Response.Body
संपत्ति प्राप्त करने के लिए लड़ रहा हूं और एकमात्र समाधान जिसे मैं पहचानने में सक्षम हूं, वह हैकी लगता है। एक स्ट्रिंग में स्ट्रीम पढ़ने के दौरान समाधान को Response.Body
MemoryStream
के साथ स्वैप करने की आवश्यकता होती है, फिर क्लाइंट को भेजने से पहले इसे वापस स्वैप करना आवश्यक होता है। नीचे दिए गए उदाहरणों में, मैं कस्टम मिडलवेयर क्लास में Response.Body
मान प्राप्त करने का प्रयास कर रहा हूं। Response.Body
सेट किसी कारण से केवल एएसपी.NET कोर में संपत्ति है? क्या मैं यहाँ कुछ याद कर रहा हूं, या यह एक निरीक्षण/बग/डिजाइन मुद्दा है? Response.Body
पढ़ने का कोई बेहतर तरीका है?एएसपी.नेट कोर प्रतिक्रिया कैसे पढ़ें। बॉडी?
Hacky समाधान:()
public class MyMiddleWare
{
private readonly RequestDelegate _next;
public MyMiddleWare(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
using (var swapStream = new MemoryStream())
{
var originalResponseBody = context.Response.Body;
context.Response.Body = swapStream;
await _next(context);
swapStream.Seek(0, SeekOrigin.Begin);
string responseBody = new StreamReader(swapStream).ReadToEnd();
swapStream.Seek(0, SeekOrigin.Begin);
await swapStream .CopyToAsync(originalResponseBody);
context.Response.Body = originalResponseBody;
}
}
}
का प्रयास किया गया समाधान EnableRewind का उपयोग कर: केवल Request.Body
, नहीं Response.Body
के लिए काम करता है। इसके परिणामस्वरूप वास्तविक प्रतिक्रिया शरीर सामग्री (जिसे मैंने पोस्टमैन का उपयोग करके सत्यापित किया है) की बजाय Response.Body
से खाली स्ट्रिंग पढ़ने में परिणाम मिलता है।
Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifeTime)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.Use(async (context, next) => {
context.Request.EnableRewind();
await next();
});
app.UseMyMiddleWare();
app.UseMvc();
// Dispose of Autofac container on application stop
appLifeTime.ApplicationStopped.Register(() => this.ApplicationContainer.Dispose());
}
MyMiddleWare.cs
public class MyMiddleWare
{
private readonly RequestDelegate _next;
public MyMiddleWare(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
await _next(context);
string responseBody = new StreamReader(context.Request.Body).ReadToEnd(); //responseBody is ""
context.Request.Body.Position = 0;
}
}
कि डिजाइन के द्वारा होता है का उदाहरण। – Nkosi