10

Ich habe einen benutzerdefinierten VirtualPathProvider geschrieben (Quelle here), der Inhalt von EmbeddedResources zurückgibt, oder von der Originaldatei, wenn sie erfahren hat, wo sie zu finden ist (damit können Sie bearbeiten und aktualisieren die Dateien ohne neu zu erstellen). Das funktioniert soweit gut.EmbeddedResource-Ansichten können nicht über den benutzerdefinierten VirtualPathProvider geladen werden

Was nicht funktioniert, ist Debuggen. Wenn ich der Ansicht einen Haltepunkt hinzufüge, werden die Symbole nicht geladen. Ich kann sehen, warum das schwierig ist (wie kann der ASP-Compiler wissen, wo die Quelldatei ist, um die Breakpoints zu erkennen?), Aber ich suche nach einer Möglichkeit, den Compiler anzugeben, wo die Quelldatei gefunden werden kann.

Beispielprojekt hier: http://dl.dropbox.com/u/2808109/VppDebugTest.zip

edit:

Ich habe mit einer ASPX-Seite zu experimentieren über das VPP geladen und durch die kompilierte Quelle sehen (mit David Ebbo's technique) und der Linie pragmas erzeugt werden so wie:

Line 275:    #line 1 "http://server/EmbeddedPage.aspx" 
Line 276:    this.InitializeCulture(); 

Normalerweise werden diese entlang der Linien von

Line 275:    #line 1 "d:/somesln/someproj/EmbeddedPage.aspx" 
erzeugt

Sie wissen nicht, ob das jemand hilft oder nicht ...

bearbeiten 2:

Nachdem David mir seinen Code geschickt, ich habe einige weitere Untersuchungen durchgeführt und die folgenden Dinge wahr zu sein scheinen:

  1. Sie können nicht einen Haltepunkt in einer ASPX gesetzt, es sei denn system.web (in VS 2010) verwiesen wird
  2. , wenn Sie eine minimale ASPX-Seite mit den Richtlinien erstellen <%@ Page Language="C#" %> und einen Haltepunkt, VS Ich werde bei der Pause anhalten nt in der Quelldatei

  3. wenn Sie eine nicht minimal ASPX- mit Richtlinien <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %> erstellen und einen Breakpoint gesetzt, wenn betrachtet VS werden Sie auf die dissasembly Debug-Ansicht nehmen

--- 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]

Es Ich werde immer noch nicht an irgendwelchen Haltepunkten in den Razor Views anhalten, was ich leider wirklich tun muss! Dieses ASPX-Material kann ein Ablenkungsmanöver sein.

edit:

5: Wenn ich einen Anruf zu Debugger.Break() in mein Index.cshtml setzen, der Debugger bei der Demontage Ansicht stoppt, und es gibt überhaupt keine Pragmas, falsche oder anderweitig

  1. Wenn ich manuell @{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" } in meiner Sicht schreibe, werden die Debugger in der Datei stoppen. Vielleicht ist die Lösung für meinen VPP, die #line-Pragmas in die cshtml-Dateien selbst einzufügen ??
+0

Welche Schritte führen in Ihrem angehängten Projekt zu den Repro? z.B. Wo navigiere ich, wann binde ich an, wo setze ich den BP usw. ein? –

+0

Setze einen Haltepunkt innerhalb von index.cshtml (zB in der @ ViewBag.Message Zeile) und der Debugger wird dort nicht stoppen wenn du rennst das Projekt. Fügen Sie einen Aufruf zu Debugger.Break() hinzu, und Sie erhalten Disassembly, nicht den Quellcode. – mcintyre321

+0

Hmmm, das ist seltsam. Die erzeugte Datei enthält in diesem Fall überhaupt keine Pragmas! Beachten Sie, dass die Codegeneratoren für aspx- und cshtml-Seiten (auch Razor genannt) völlig unterschiedlich sind. Dies könnte ein Problem für Razor sein. –

Antwort

2

Ich hatte das gleiche Problem und endlich funktionierte es mit einem benutzerdefinierten RazorHost. Es scheint, dass der Speicherort der physischen Datei mithilfe der Methode HostingEnvironment.MapPath() aufgelöst wird, die das korrekte Ergebnis für eingebettete Dateien nicht zurückgibt.

Was ich tat:

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 
    } 
} 

Als letzten Schritt müssen Sie ASP.NET sagen, welche Fabrik Host sollte es verwenden. Dies wird in der web.config getan:

<system.web.webPages.razor> 
    <host factoryType="My.Custom.Namespace.MyCustomRazorHostFactory" /> 
</system.web.webPages.razor> 

Ich weiß, dass meine Antwort kommt ein bisschen spät, aber hoffentlich jemand anderes davon Gebrauch machen können, wenn sie über diese Frage zu stolpern wie ich. :)

+0

wow super, ich werde sehen, ob ich das in mein nugget Paket integrieren kann wenn ich eine Chance bekomme – mcintyre321

+1

Endlich Rund um es zu tun und es funktioniert !!! Ich habe einige Eigenschaften auf meinem EmbeddedResourceVirtualPathProvider-Projekt ausgesetzt, um die Methoden zu implementieren, finden Sie unter https://gist.github.com/mcintyre321/ff67ffa8e2f0c8ef86da – mcintyre321

1

Ich habe versucht, mit Ihrem Code ein bisschen zu spielen, und als ich einen Test aspx in den Ressourcen hinzugefügt, schien das Debugging gut zu funktionieren. Ich konnte einen BP in Page_Load setzen, und es git dort.

Sie können meine Veränderung in https://github.com/davidebbo/EmbeddedResourceVirtualPathProvider

Hinweis sehen, dass ich die Ausweich Logik deaktiviert, da ich auf dem eingebetteten Fall konzentrieren wollte, obwohl ich glaube nicht, dass ein Unterschied macht.

Beachten Sie, dass ich VS2012 verwende, also musste ich auch das Projekt/SLN aktualisieren (aber sie werden noch 2010 arbeiten).

Der Grund, dass ASP.NET das http-Line-Pragma generiert, ist, dass es die physische aspx-Datei am Standardspeicherort nicht finden kann (d. H. Was MapPath zurückgeben würde). Es gibt tatsächlich eine wenig bekannte Möglichkeit, dieses Verhalten immer zu aktivieren: set urlLinePragmas = true im Abschnitt (http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.urllinepragmas.aspx) .

+0

Danke, dass du dir das angeschaut hast! Du hast ein paar interessante Dinge angesprochen, ich werde die Frage aktualisieren, um sie wiederzugeben. – mcintyre321

+0

Gibt es eine Möglichkeit, wie ich in den Lookup-ASP einsteigen kann macht das für die urlLinePragmas und sagt es wo die echte Quelldatei ist? (Würde dies mein Problem mit Razor Ansichten beheben) – mcintyre321

Verwandte Themen