当Url是ASPX页面时,HttpContext.Current.Request.Url.IsFile返回False

时间:2014-12-04 23:00:19

标签: c# asp.net http

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

我的目标是确定请求何时是global.asax文件中的aspx文件,如果它是aspx文件(并且只是一个aspx文件),则使用:

HttpContext.Current.Request.Url.IsFile

然而,它一直在解析false,我不知道为什么。我完整的global.asax代码是:

if(HttpContext.Current.Request.Url.IsFile)
{
    if(File.Exists(HttpContext.Current.Request.Url.LocalPath))
    {
        if(new FileInfo(HttpContext.Current.Request.Url.LocalPath).Extension.Equals("aspx"))
        {
            DoSomethingWithThePagesURL();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您是否看过Documentation for IsFile Property?。从文档中可以清楚地看出Http:不是File:

  

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

DotNetFiddle Example

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");
  }
}

结果:

  

\服务器\ FILENAME.EXT

     

Uri是UNC路径

     

Uri不是本地主持人

     

Uri是一个文件

答案 1 :(得分:0)

我使用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;
}