Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#检查中间件中的响应类型_C#_Asp.net Core_Middleware - Fatal编程技术网

C#检查中间件中的响应类型

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, &

在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, "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;
        }

    }
}