我正在處理其中一項要求,我需要修改中間件中的結果資料(不是任何 MVC 過濾器,因為通過中間件注入了一些其他服務)。
在中間件中,我以 json 格式獲取資料,然后反序列化該資料,然后更新該資料,最后序列化為 JSON 并將其作為回應發送回來。
我不想在 MVC 管道中序列化資料,所以我嘗試洗掉輸出格式化程式,但這對我不起作用并拋出錯誤。
services.AddControllers(options =>
{
options.OutputFormatters.Clear();
});
是否有任何解決方案可以在管道中獲取 .Net 物件并修改該物件(就像我們在 MVC 過濾器中所做的那樣)然后最后序列化?
uj5u.com熱心網友回復:
我不確定它是否符合您的要求,但您可以使用 HttpContext 在請求范圍記憶體儲一些資料。有一個“專案”鍵值集合。
uj5u.com熱心網友回復:
旁邊的其他建議,使用Items的HttpContext的,我要指出,你可以中注入服務行動過濾器:
public class ResultFilter : IActionFilter
{
// Inject anything you want
IHostEnvironment env;
public ResultFilter(IHostEnvironment env)
{
this.env = env;
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Result is OkObjectResult result)
{
result.Value = JsonSerializer.Serialize(new
{
Value = result.Value,
Environment = this.env.EnvironmentName,
});
}
}
public void OnActionExecuting(ActionExecutingContext context) { }
}
注冊到 DI Builder:
services.AddScoped<ResultFilter>();
適用于動作/控制器:
[HttpGet, Route("/test"), ServiceFilter(typeof(ResultFilter))]
public IActionResult ReturnOk()
{
return this.Ok(new
{
Value = 1,
});
}
通過訪問 URL 進行測驗:
{"Value":{"Value":1},"Environment":"Development"}
uj5u.com熱心網友回復:
另一種選擇是使用具有Scoped生命周期的DI 服務。
對于給定的請求,作用域物件是相同的,但在每個新請求中都不同。
服務:
public interface IMyRequestDataService
{
object? MyData { get; set; }
}
public class MyRequestDataService : IMyRequestDataService
{
public object? MyData { get; set; }
}
注冊到 DI:
services.AddScoped<IMyRequestDataService, MyRequestDataService>();
在控制器中設定資料:
readonly IMyRequestDataService dataService;
public TestController(IMyRequestDataService dataService)
{
this.dataService = dataService;
}
[HttpGet, Route("/test-scoped")]
public IActionResult ReturnObj()
{
this.dataService.MyData = new
{
Value = 1,
};
return this.Ok();
}
使用它的中間件:
class CustomMiddleware
{
readonly RequestDelegate next;
public CustomMiddleware(RequestDelegate next)
{
this.next = next;
}
// Add DI Services here
public async Task InvokeAsync(HttpContext httpContext, IMyRequestDataService dataService, IHostEnvironment env)
{
await this.next(httpContext);
// Data should be here
if (dataService.MyData != null)
{
// Do something with it
await httpContext.Response.WriteAsJsonAsync(new
{
Data = dataService.MyData,
Env = env.EnvironmentName,
});
}
}
}
// Register it:
app.UseMiddleware<CustomMiddleware>();
// Make sure it's before the Controller middleware since we wrap it around the next()
// ...
app.MapControllers();
使用 URL 進行測驗:
{"data":{"value":1},"env":"Development"}
uj5u.com熱心網友回復:
您可以將資料存盤在 HTTP 背景關系項中。
在控制器動作中:
Request.HttpContext.Items.Add("SomeKey", data);
在中間件中:
object data = httpContext.Items["SomeKey"];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373538.html
標籤:网站 asp.net-mvc asp.net核心 asp.net 核心中间件
上一篇:VisualStudio2022-VisualBasicASP.NETWeb應用程式
下一篇:從一對多關系資料庫查詢到資料表
