C# 当Url为ASPX页面时,HttpContext.Current.Request.Url.IsFile返回False

C# 当Url为ASPX页面时,HttpContext.Current.Request.Url.IsFile返回False,c#,asp.net,http,C#,Asp.net,Http,我正在点击表单的本地URL:http://localhost/example.dev/eu/default.aspx. 我的目标是确定请求何时是global.asax文件中的aspx文件,然后使用以下命令执行操作(如果是aspx文件且仅是aspx文件): HttpContext.Current.Request.Url.IsFile 然而,它一直都是错误的,我不知道为什么。我的完整global.asax代码为: 你看了那张照片了吗。从文档中可以很清楚地看到Http:不是文件: 当Scheme属性

我正在点击表单的本地URL:http://localhost/example.dev/eu/default.aspx.

我的目标是确定请求何时是global.asax文件中的aspx文件,然后使用以下命令执行操作(如果是aspx文件且仅是aspx文件):

HttpContext.Current.Request.Url.IsFile
然而,它一直都是错误的,我不知道为什么。我的完整global.asax代码为:


你看了那张照片了吗。从文档中可以很清楚地看到Http:不是文件:

当Scheme属性等于UriSchemeFile时,IsFile属性为true

结果:

\server\filename.ext

Uri是一个UNC路径

Uri不是本地主机

Uri是一个文件


我使用Nuget包walter.web.firewall在每个请求中注入一个IPageRequest,它包含对请求底层资源的访问,并将通过IPageRequest.LocalFile提供访问

但是,如果您确实需要防火墙,并且自提出此问题以来已经有一段时间了,而且自提出此问题以来,已经发生了许多框架更改,那么让我尝试以一种不使用框架类的方式来回答它,希望它能在将来尝试并实现它

代码如下:

public enum FileLocation
{
    NotSet,
    Disk,
    Resource,
}

private static readonly string[] FileExtenstions = new[] {
    ".js"
    ,".ts"
    ,".vue"
    ,".css"
    ,".jpg"
    ,".png"
    ,".gif"
    ,".ico"
    ,".svg"
    ,".ttf"
    ,".eot"
    ,".ttf"
    ,".woff"
    ,".woff2"
    ,".mp4"
    ,".mp3"
    ,".emf"
};

public FileLocation IsMappedTo(Uri uri)
{
    if (uri is null)
    {
        throw new ArgumentNullException(nameof(uri));
    }
    //make sure we support .net default URI contract
    if (uri.IsFile)
        return FileLocation.Disk;

    //now assume you are looking in a web application
    var path = uri.AbsolutePath;
    if (path.Length == 0 || path.Equals("/",StringComparison.Ordinal) || path.Length< FileExtenstions.Min(s=>s.Length))
        return FileLocation.NotSet;

    //get the directory normally one would use IWebHostEnvironment.ContentRootPath different versions .net will have other methods
    var dir = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");

    //get all resources names from the assembly hosting this class out side if the loop from this assembly you can also use
    //you can also use GetManifestResourceNames() to use the web application's assembly
    var resourceNames = new HashSet<string>(this.GetType().Assembly.GetManifestResourceNames());
    var entryAssembly = Assembly.GetEntryAssembly();
    if (entryAssembly != null && entryAssembly != this.GetType().Assembly)
    {
        foreach (var entry in entryAssembly.GetManifestResourceNames())
        {
            if (string.IsNullOrEmpty(entry))
                resourceNames.Add(entry);
        }
    }

    for (var i = 0; i < FileExtenstions.Length; i++)
    {
        if (FileExtenstions[i].Equals(path[FileExtenstions[i].Length..], StringComparison.OrdinalIgnoreCase) || path.Contains(FileExtenstions[i], StringComparison.OrdinalIgnoreCase))
        {
            //exists on disk
            if (File.Exists(Path.Combine(dir, path.Replace("/", @"\"))))
                return FileLocation.Disk;

            //has a file as an embedded resource with the same name (ignores the path) so you might have duplicates names
            if (resourceNames.Any(a => a.EndsWith(path.Split('/')[^1], StringComparison.OrdinalIgnoreCase)))
                return FileLocation.Resource;
        }
    }

    return FileLocation.NotSet;
}

看看这里有什么有用的东西。。
using System;
                
public class Program
{
  public static void Main()
  {
    Uri uriAddress2 =  new Uri("file://server/filename.ext");
    Console.WriteLine(uriAddress2.LocalPath);
    Console.WriteLine("Uri {0} a UNC path", uriAddress2.IsUnc ? "is" : "is not");
    Console.WriteLine("Uri {0} a local host", uriAddress2.IsLoopback ? "is" : "is not");
    Console.WriteLine("Uri {0} a file", uriAddress2.IsFile ? "is" : "is not");
  }
}
public enum FileLocation
{
    NotSet,
    Disk,
    Resource,
}

private static readonly string[] FileExtenstions = new[] {
    ".js"
    ,".ts"
    ,".vue"
    ,".css"
    ,".jpg"
    ,".png"
    ,".gif"
    ,".ico"
    ,".svg"
    ,".ttf"
    ,".eot"
    ,".ttf"
    ,".woff"
    ,".woff2"
    ,".mp4"
    ,".mp3"
    ,".emf"
};

public FileLocation IsMappedTo(Uri uri)
{
    if (uri is null)
    {
        throw new ArgumentNullException(nameof(uri));
    }
    //make sure we support .net default URI contract
    if (uri.IsFile)
        return FileLocation.Disk;

    //now assume you are looking in a web application
    var path = uri.AbsolutePath;
    if (path.Length == 0 || path.Equals("/",StringComparison.Ordinal) || path.Length< FileExtenstions.Min(s=>s.Length))
        return FileLocation.NotSet;

    //get the directory normally one would use IWebHostEnvironment.ContentRootPath different versions .net will have other methods
    var dir = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");

    //get all resources names from the assembly hosting this class out side if the loop from this assembly you can also use
    //you can also use GetManifestResourceNames() to use the web application's assembly
    var resourceNames = new HashSet<string>(this.GetType().Assembly.GetManifestResourceNames());
    var entryAssembly = Assembly.GetEntryAssembly();
    if (entryAssembly != null && entryAssembly != this.GetType().Assembly)
    {
        foreach (var entry in entryAssembly.GetManifestResourceNames())
        {
            if (string.IsNullOrEmpty(entry))
                resourceNames.Add(entry);
        }
    }

    for (var i = 0; i < FileExtenstions.Length; i++)
    {
        if (FileExtenstions[i].Equals(path[FileExtenstions[i].Length..], StringComparison.OrdinalIgnoreCase) || path.Contains(FileExtenstions[i], StringComparison.OrdinalIgnoreCase))
        {
            //exists on disk
            if (File.Exists(Path.Combine(dir, path.Replace("/", @"\"))))
                return FileLocation.Disk;

            //has a file as an embedded resource with the same name (ignores the path) so you might have duplicates names
            if (resourceNames.Any(a => a.EndsWith(path.Split('/')[^1], StringComparison.OrdinalIgnoreCase)))
                return FileLocation.Resource;
        }
    }

    return FileLocation.NotSet;
}