我写了一个自定义的VirtualPathProvider(源在这里 ),如果它被告知哪里可以找到它(这可以让你无需重新构建编辑和更新文件),这将返回内容从EmbeddedResources,或从原来的文件。 这是工作的罚款,到目前为止。
什么是不工作是调试。 如果我添加一个断点到视图,它不会加载的符号。 我能看到为什么这是困难的(ASP的编译器怎么能知道那里的源文件,以现货断点?),但我在寻找一种方式来暗示到源文件可以找到的编译器。
示例项目在这里: http://dl.dropbox.com/u/2808109/VppDebugTest.zip
编辑:
我一直在尝试通过VPP加载一个ASPX页面,并通过查看编译源(使用大卫博的技术 ),以及行杂像这样产生的:
Line 275: #line 1 "http://server/EmbeddedPage.aspx"
Line 276: this.InitializeCulture();
通常,这些是沿着线产生
Line 275: #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"
不知道有没有什么帮助任何人,或不...
编辑2:
之后大卫给我发了他的代码,我做了一些进一步的调查和下面的事情似乎是真实的:
- 除非是System.Web程序(在VS 2010)引用你不能在一个的.aspx设置断点
如果创建的指令最小.aspx页面中<%@ Page Language="C#" %>
,并设置一个断点,VS将停止在源文件中的断点
如果创建一个非最小的.aspx与指令<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %>
和设置断点,观察VS时将带你到dissasembly调试视图
--- http://server/WebForm1.aspx ------------------------------------------------ 0000003a mov ecx,dword ptr [ebp-3Ch] 0000003d call 63EC54F0 00000042 mov dword ptr [ebp-44h],eax 00000045 mov edx,dword ptr ds:[03E62200h] 0000004b mov ecx,dword ptr [ebp-44h]
它仍然不会停止在剃刀意见任何断点,这是不幸的是我真正需要的是能够做到! 这东西的.aspx可能是一个红色的鲱鱼。
编辑:
5:如果我把一个呼叫Debugger.Break()到我Index.cshtml,调试器停在反汇编视图,并且没有编译指示在所有的,不正确的或以其他方式
- 如果我手动编写
@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }
在我看来,调试将停止在文件中。 所以,也许解决方案是我的VPP插入的#line编译指示到CSHTML文件本身?
我有同样的问题,终于得到它通过使用自定义RazorHost工作。 看来,物理文件位置使用解决HostingEnvironment.MapPath()
不为嵌入文件返回正确结果的方法。
我做了什么:
public class MyCustomRazorHostFactory : WebRazorHostFactory
{
public override System.Web.WebPages.Razor.WebPageRazorHost CreateHost( string virtualPath, string physicalPath )
{
// Implementation stolen from MvcRazorHostFactory :)
var host = base.CreateHost( virtualPath, physicalPath );
if( !host.IsSpecialPage )
{
return new MyCustomRazorHost( virtualPath, physicalPath );
}
return host;
}
}
public class MyCustomRazorHost : MvcWebPageRazorHost
{
public MyCustomRazorHost( string virtualPath, string physicalPath )
: base( virtualPath, physicalPath )
{
if( MyMagicHelper.IsEmbeddedFile( virtualPath ) )
{
PhysicalPath = MyMagicHelper.GetPhysicalFilePath(virtualPath);
}
}
}
// Simplified for demonstration purpose
public static class MyMagicHelper
{
public static bool IsEmbeddedFile(string virtualPath)
{
// ... check if the path is an embedded file path
}
public static string GetPhysicalFilePath(string virtualPath)
{
// ... resolve the virtual file and return the correct physical file path
}
}
作为最后一步,你需要告诉ASP.NET,应该使用的主机厂家。 这是在web.config中完成的:
<system.web.webPages.razor>
<host factoryType="My.Custom.Namespace.MyCustomRazorHostFactory" />
</system.web.webPages.razor>
我知道我的回答来得有点迟,但希望别人能过这个问题,磕磕绊绊,像我一样的时候使用它。 :)
我试着用你的代码打了一下,当我在资源增加了一个测试的aspx,调试似乎很好地工作。 我能够在Page_Load中设置BP,它的git那里。
你可以看到我的变化https://github.com/davidebbo/EmbeddedResourceVirtualPathProvider
请注意,我禁用了后备逻辑,因为我想专注于嵌入式情况下,虽然我不认为这有差别。
请注意,我用VS2012,所以我也不得不升级项目/ SLN(但他们仍然会在2010年的工作)。
究其原因ASP.NET正在生成HTTP行编译的是,它无法找到在标准位置的物理aspx文件(即什么样的MapPath将返回)。 实际上有一个鲜为人知的方法来总是这种行为转:SET urlLinePragmas = true在部分(http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.urllinepragmas.aspx) 。