3 Stimmen

RavenDb Mini Profiler lädt nur beim ersten Seitenaufruf.

Ich versuche, den Mini-Profiler für RavenDb in meinem ASP.NET MVC4-Projekt zum Laufen zu bringen.

Ich habe folgendes in meinem Unity-Bootstrapper:

[assembly: WebActivator.PreApplicationStartMethod(typeof(Web.App.App_Start.AppStart_Unity), "Start")]
public static class AppStart_Unity
{
    public static void RegisterServices(IUnityContainer container)
    {
        container.RegisterInstance(DocumentStoreFactory.Create(ConfigurationManager.ConnectionStrings[0].Name));
        container.RegisterType(new HierarchicalLifetimeManager(), new InjectionFactory(c => c.Resolve().OpenSession(ConfigurationManager.ConnectionStrings[0].Name)));
    }

    public static void Start()
    {
        // Erstelle den Unity-Container
        IUnityContainer container = new UnityContainer();

        // Registriere Dienste mit unserem Unity-Container
        RegisterServices(container);

        // Sag ASP.NET MVC, unseren Unity-DI-Container zu verwenden
        DependencyResolver.SetResolver(new UnityServiceLocator(container));

        // Verknüpfe den Profiler    
        var store = container.Resolve();
        var documentStore = store as DocumentStore;
        if (documentStore != null)
        {
            Raven.Client.MvcIntegration.RavenProfiler.InitializeFor(documentStore);
        }
    }
}

In meinem Master-Layout habe ich folgendes:

    @Raven.Client.MvcIntegration.RavenProfiler.CurrentRequestSessions()

Beim ersten Start der Webanwendung sehe ich den Profiler, kein Problem.

Bei allen nachfolgenden Seitenanfragen ist der Profiler jedoch nicht sichtbar.

Wenn ich mir den Quellcode der Seite anschaue, sehe ich, dass der Div-Container vorhanden ist, aber ohne Daten gefüllt ist. Keine JavaScript-Fehler. Sehr merkwürdig. Der gerenderte HTML-Code sieht so aus:

    Schließen

Beim Vergleich der Anfragen sehe ich folgende Anfragen beim ersten Laden:

  1. http://localhost:62238/ravendb/profiling?path=yepnope.js
  2. http://localhost:62238/ravendb/profiling?path=jquery.tmpl.min.js
  3. http://localhost:62238/ravendb/profiling?path=ravendb-profiler-scripts.js
  4. http://localhost:62238/ravendb/profiling?path=jquery.tmpl.min.js
  5. http://localhost:62238/ravendb/profiling?path=ravendb-profiler-scripts.js
  6. http://localhost:62238/ravendb/profiling?path=Templates%2Ftotals.tmpl.html
  7. http://localhost:62238/ravendb/profiling?path=Templates%2Fravendb-profiler.tmpl.html
  8. http://localhost:62238/ravendb/profiling?path=Templates%2Fsession-template.tmpl.html
  9. http://localhost:62238/ravendb/profiling?path=Templates%2Frequest-details.tmpl.html
  10. http://localhost:62238/ravendb/profiling?id%5B%5D=d3ada4e4-4bc3-4a7c-bd36-64cc8017d94a
  11. http://localhost:62238/ravendb/profiling?path=styles.css

Bei nachfolgenden Ladevorgängen sehe ich folgende Anfragen:

  1. http://localhost:62238/ravendb/profiling?path=yepnope.js
  2. http://localhost:62238/ravendb/profiling?path=jquery.tmpl.min.js
  3. http://localhost:62238/ravendb/profiling?path=ravendb-profiler-scripts.js
  4. http://localhost:62238/ravendb/profiling?path=jquery.tmpl.min.js
  5. http://localhost:62238/ravendb/profiling?path=ravendb-profiler-scripts.js

Merkwürdigerweise sehe ich in beiden Fällen doppelte Aufrufe von jquery.tmpl.min.js und ravendb-profiler-scripts.js.

Die ravendb-profiler-scripts.js enthält die Zeilen:

 9. var load = function () {
10. if (options.id.length == 0)
11.    return;

Bei den nachfolgenden Ladevorgängen ist options.id.length null. Die Templates werden dann nicht geladen und die Ergebnisse werden nicht abgerufen.

Der erste Seitenladevorgang enthält das Skript:

yepnope([{ test: window.jQuery, nope: '/ravendb/profiling?path=jquery-1.6.1.min.js' }, { test: window.jQuery && window.jQuery.fn.tmpl, nope: '/ravendb/profiling?path=jquery.tmpl.min.js' }, {load: '/ravendb/profiling?path=ravendb-profiler-scripts.js', complete: function() { jQuery(function() { RavenDBProfiler.initalize({ id:['df05238a-24a6-4a16-ad63-3b9537e9b544'], url: '/ravendb/profiling' }); }) } }]);

Die nachfolgenden Ladevorgänge enthalten:

yepnope([{ test: window.jQuery, nope: '/ravendb/profiling?path=jquery-1.6.1.min.js' }, { test: window.jQuery && window.jQuery.fn.tmpl, nope: '/ravendb/profiling?path=jquery.tmpl.min.js' }, {load: '/ravendb/profiling?path=ravendb-profiler-scripts.js', complete: function() { jQuery(function() { RavenDBProfiler.initalize({ id:[], url: '/ravendb/profiling' }); }) } }]);

Bemerken Sie das Fehlen von id-Objekten.

Ich habe auch den Mini-Profiler ausprobiert und habe versucht, von der neuesten instabilen RavenDb-Clientversion zur aktuellen stabilen Version zurückzukehren. Nichts scheint einen Unterschied zu machen.

Ist dies das erwartete Verhalten? Muss ich noch etwas anderes tun? Mache ich hier einen Fehler?

Aktualisierung

Ich habe gerade das Glimpse.Ravendb-Plugin installiert und es zeigt an:

Das Profiling wird derzeit nicht für EmbeddableDocumentStore unterstützt.

Ich benutze jedoch offensichtlich nicht den EmbeddableDocumentStore:

public static class DocumentStoreFactory
{
    public static IDocumentStore Create(string connectionStringName)
    {
        var documentStore = new DocumentStore { ConnectionStringName = connectionStringName };
        documentStore.Initialize();
        documentStore.DatabaseCommands.EnsureDatabaseExists(connectionStringName);

        var catalog = new CompositionContainer(new AssemblyCatalog(typeof(Users_ByKarmaAndLocation).Assembly));
        IndexCreation.CreateIndexes(catalog, documentStore.DatabaseCommands.ForDatabase(connectionStringName), documentStore.Conventions);

        return documentStore;
    }
}

Ich bin mir nicht sicher, ob das eine falsche Fährte ist oder nicht. Ich wollte es aber erwähnen.

0voto

Rebecca Punkte 13344

Das Problem lag an meinem Unity-Setup. Ich hätte nicht ein Unity HierarchicalLifetimeManager() verwenden sollen, sondern ein PerResolveLifetimeManager(). Das Glimpse-Problem wurde gelöst, sobald ich die Anwendung neu gestartet hatte.

Im Nachhinein hätte ich genauer auf die verschiedenen Arten von LifetimeContainern achten und sie ordnungsgemäß verwenden sollen.

Die aktualisierte Unity-Konfiguration sieht wie folgt aus:

public static class AppStart_Unity
{
    public static void RegisterServices(IUnityContainer container)
    {
        container.RegisterInstance(DocumentStoreFactory.Create(ConfigurationManager.ConnectionStrings[0].Name));
        //container.RegisterType(new HierarchicalLifetimeManager(), new InjectionFactory(c => c.Resolve().OpenSession(ConfigurationManager.ConnectionStrings[0].Name)));
        container.RegisterType(new PerResolveLifetimeManager(), new InjectionFactory(c => c.Resolve().OpenSession()));
    }

    public static void Start()
    {
        // Erstelle den Unity-Container
        IUnityContainer container = new UnityContainer();

        // Registriere Dienste mit unserem Unity-Container
        RegisterServices(container);

        // Teile ASP.NET MVC mit, unseren Unity-DI-Container zu verwenden
        DependencyResolver.SetResolver(new UnityServiceLocator(container));

        var store = container.Resolve();
        var documentStore = store as DocumentStore;
        if (documentStore == null)
        {
            return;
        }

        RavenProfiler.InitializeFor(
            documentStore,
            "Email", "HashedPassword", "AkismetKey", "PasswordSalt", "UserHostAddress");
        Profiler.AttachTo(documentStore);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X