gpt4 book ai didi

asp.net - IIS 中的自定义虚拟路径提供程序

转载 作者:行者123 更新时间:2023-12-04 22:25:10 26 4
gpt4 key购买 nike

在 IIS 7.5 中实现自定义虚拟路径提供程序的正确配置是什么?以下代码在使用 ASP.NET 开发服务器从 Visual Studio 运行时按预期工作,但在从 IIS 运行时不加载图像。

.NET 4.0 项目文件

CustomVirtualPathProvider.zip - SkyDrive 文件

Web.config

<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>

默认.aspx
<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Virtual Path Provider</title>
</head>
<body>
<img src="Box.png" />
</body>
</html>

Global.asax
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new WebApplication1.CustomVirtualPathProvider());
}
}

CustomVirtualFile.cs
public class CustomVirtualFile : System.Web.Hosting.VirtualFile
{
private string _VirtualPath;

public CustomVirtualFile(string virtualPath) : base(virtualPath)
{
_VirtualPath = virtualPath.Replace("/", string.Empty);
}

public override Stream Open()
{
string ImageFile =
System.IO.Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, @"Crazy\Image\Path", _VirtualPath);
return System.IO.File.Open(ImageFile, FileMode.Open, FileAccess.Read);
}
}

CustomVirtualPathProvider.cs
public class CustomVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
{
Collection<string> ImageTypes;

public CustomVirtualPathProvider() : base()
{
ImageTypes = new Collection<string>();
ImageTypes.Add(".PNG");
ImageTypes.Add(".GIF");
}

public override bool FileExists(string virtualPath)
{
if (IsImage(virtualPath))
{
return true;
}
return base.FileExists(virtualPath);
}

public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
{
if (IsImage(virtualPath))
{
return new CustomVirtualFile(virtualPath);
}
return base.GetFile(virtualPath);
}

private bool IsImage(string file)
{
return ImageTypes.IndexOf(file.ToUpperInvariant().Substring(file.Length - 4, 4)) > -1;
}
}

文件系统
\Crazy\Image\Path\Box.png

IIS 配置

没有配置更改的默认站点。

最佳答案

这是我发现的“解决”我的问题。

http://sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/

简单来说:

HostingEnviornment 明确忽略预编译站点中的虚拟路径提供程序。您可以通过使用反射调用省略此检查的内部版本来规避此限制。因此,而不是调用

HostingEnviornment.RegisterVirtualPathProvider(new EmbeddedViewVirtualPathProvider();

改为调用它:
typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal",
BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.NonPublic)
.Invoke(null, new object[] {new EmbeddedViewPathProvider()});

关于asp.net - IIS 中的自定义虚拟路径提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235337/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com