C#检查中间件中的响应类型
在C#.NET Core 3.1 Web API项目中,我返回如下文件:C#检查中间件中的响应类型,c#,asp.net-core,middleware,C#,Asp.net Core,Middleware,在C#.NET Core 3.1 Web API项目中,我返回如下文件: [HttpGet] public async Task<IActionResult> ReadBook(int bookId) { var bookService = new BookService(); var book = bookService.getBook(bookId); return PhysicalFile(bookService.AbsoluteFilePath, &
[HttpGet]
public async Task<IActionResult> ReadBook(int bookId) {
var bookService = new BookService();
var book = bookService.getBook(bookId);
return PhysicalFile(bookService.AbsoluteFilePath, "application/octet-stream");
}
问题是文件可能很大,我不需要专门为这个动作倒带正文。有没有一种方法可以跳过这个特殊操作的中间件?在劫持和复制之前,我可以检查请求操作类型或响应类型是否为PhysicalFileResult?谢谢如果您可以访问上下文,您还应该可以访问操作描述符。您可以尝试应用自定义属性,然后在倒带之前检查该属性。@DavidL谢谢。你知道跳过它是否会提高性能吗?据我所知,我正在将一个可能很大的文件复制到另一个内存流中,对吗?您必须对其进行分析,尽管这似乎会显著提高性能。
public class MyMiddleware
{
private readonly RequestDelegate next;
public ResponseRewindMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
var originalBody = context.Response.Body;
try
{
await using var memStream = new MemoryStream();
context.Response.Body = memStream;
await next(context);
memStream.Position = 0;
await memStream.CopyToAsync(originalBody);
}
finally
{
context.Response.Body = originalBody;
}
}
}