【发布时间】:2014-08-05 21:22:15
【问题描述】:
我似乎无法让自定义 VirtualPathProvider 在 asp.net MVC 5 中工作。
FileExists 方法返回 true,但不会调用 GetFile 方法。 我相信这是因为 IIS 接管了请求并且不让 .NET 处理它。
我已经尝试设置 RAMMFAR 并创建一个自定义处理程序,就像在这个解决方案 https://stackoverflow.com/a/12151501/801189 中一样,但仍然没有运气。我收到错误 404。
我的自定义提供者:
public class DbPathProvider : VirtualPathProvider
{
public DbPathProvider() : base()
{
}
private static bool IsContentPath(string virtualPath)
{
var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith("~/CMS/", StringComparison.InvariantCultureIgnoreCase);
}
public override bool FileExists(string virtualPath)
{
return IsContentPath(virtualPath) || base.FileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath)
{
return IsContentPath(virtualPath) ? new DbVirtualFile(virtualPath) : base.GetFile(virtualPath);
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
return null;
}
public override String GetFileHash(String virtualPath, IEnumerable virtualPathDependencies)
{
return Guid.NewGuid().ToString();
}
}
我的自定义虚拟文件:
public class DbVirtualFile : VirtualFile
{
public DbVirtualFile(string path): base(path)
{
}
public override System.IO.Stream Open()
{
string testPage = "This is a test!";
return new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(testPage));
}
}
web.config 处理程序我尝试使用,但没有成功。它目前给出错误 500:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="FormsAuthenticationModule" />
</modules>
<handlers>
<add name="ApiURIs-ISAPI-Integrated-4.0"
path="/CMS/*"
verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="runtimeVersionv4.0" />
</handlers>
如果我尝试导航到 site.com/CMS/Home/Index,则会调用 FileExists 方法,但奇怪的是,virtualPath 参数只接收 ~/CMS/Home。
添加断点,似乎对于 url site.com/CMS/Home/Index,FileExists 方法不断被重复调用。这可能会导致无限递归,从而导致内部服务器错误。
【问题讨论】:
标签: asp.net-mvc iis asp.net-mvc-routing asp.net-mvc-5