C# 文件存在时未找到VirtualFileResult文件

C# 文件存在时未找到VirtualFileResult文件,c#,asp.net-core,asp.net-core-mvc,filenotfoundexception,C#,Asp.net Core,Asp.net Core Mvc,Filenotfoundexception,也许我不理解VirtualFileResult是什么,但我不确定当文件存在时为什么会抛出FileNotFoundException。代码如下: if (System.IO.File.Exists(fileName)) { FileInfo info = new FileInfo(fileName); return File(fileName, FileUtility.GetContentType(fileName), info.Name); } (编辑:FileUtility

也许我不理解VirtualFileResult是什么,但我不确定当文件存在时为什么会抛出FileNotFoundException。代码如下:

if (System.IO.File.Exists(fileName))
{
    FileInfo info = new FileInfo(fileName);

    return File(fileName, FileUtility.GetContentType(fileName), info.Name);
}
(编辑:
FileUtility.GetContentType
(正确)返回文件的Mime类型,在我的例子中是
“application/pdf”

我得到了一个例外:(我删除了文件路径)

System.IO.FileNotFoundException:找不到文件:[文件路径已删除]
文件名:“[文件路径已删除]”
在Microsoft.AspNet.Mvc.VirtualFileResult.d_u11.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d_u56.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d_u55.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d_u54.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d_u49.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.d_u44.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler.d_u6.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Routing.Template.TemplateRoute.d_u27.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Routing.RouteCollection.d_u9.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Builder.RouterMiddleware.d_u4.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.IISPlatformHandler.IISPlatformHandlerMiddleware.d_u8.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Diagnostics.StatusCodePagesMiddleware.d_u3.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.AspNet.Diagnostics.DeveloperExceptionPageMiddleware.d_u7.MoveNext()上
即使对该文件是否存在进行了显式检查,它似乎也被窃听掉了。我还可以手动确认该文件是否存在

也许我不理解VirtualFileResult是什么(File方法返回这个)。在文档中,它并没有真正描述它是什么


我正在使用ASP.NET 5 RC1。

VirtualFileResult类需要其构造函数中文件的虚拟路径。
这意味着您需要提供相对于
wwwroot
文件夹的路径,因为它使用HostingEnvironment的
WebRootFileProvider

    private IFileProvider GetFileProvider(IServiceProvider requestServices)
    {
        if (FileProvider != null)
        {
            return FileProvider;
        }

        var hostingEnvironment = requestServices.GetService<IHostingEnvironment>();
        FileProvider = hostingEnvironment.WebRootFileProvider;

        return FileProvider;
    }
}
专用IFileProvider GetFileProvider(IServiceProvider requestServices)
{
if(FileProvider!=null)
{
返回文件提供者;
}
var hostingEnvironment=requestServices.GetService();
FileProvider=hostingEnvironment.WebRootFileProvider;
返回文件提供者;
}
}
检查VirtualFileResult mu上的代码
    private IFileProvider GetFileProvider(IServiceProvider requestServices)
    {
        if (FileProvider != null)
        {
            return FileProvider;
        }

        var hostingEnvironment = requestServices.GetService<IHostingEnvironment>();
        FileProvider = hostingEnvironment.WebRootFileProvider;

        return FileProvider;
    }
}
return File("~/foo.js","text/javascript")
public virtual FileStreamResult File(Stream fileStream, 
       string contentType, string fileDownloadName);
 using System.IO;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Logging;

 public class IndexController : Controller
 {
    ILoggerFactory Logger;

    public IndexController(ILoggerFactory loggerFactory)
    {
        Logger = loggerFactory;
    }

    static string sep = Path.DirectorySeparatorChar.ToString();

    [HttpGet("/index")]
    [HttpGet("/")]
    public IActionResult Index()
    {
        var log = Logger.CreateLogger("trace");

        var path = $"{Startup.RootPath}{sep}index.html";
        log.LogWarning(path);
        Stream fileStream  = new System.IO.FileStream(path, FileMode.Open);

        return File(fileStream, "text/html");
    }
}

// AspnetCore version 1.1.1 :
// <TargetFramework>netcoreapp1.1</TargetFramework>
// <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
return PhysicalFile(fileName, FileUtility.GetContentType(fileName), info.Name);