ServiceStack Profiler NullReferenceException

时间:2014-04-03 15:34:56

标签: c# asp.net-mvc-4 servicestack ormlite-servicestack mvc-mini-profiler

我认为我正确地设置了ServiceStack的分析器,但也许我不是。我只是试图掌握基础知识。

到目前为止我做了什么

我到目前为止安装分析的唯一步骤 - 在Global.asax.cs

   private void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.IsLocal)
        {
            Profiler.Start();
        }
    }

    private void Application_EndRequest(object sender, EventArgs e)
    {
        Profiler.Stop();
    }

在我的_SiteLayout.cshtml页面中,在呈现任何其他javascript文件之前,我尝试渲染:

<body>
<!-- ... -->

@Html.Raw(HttpUtility.HtmlDecode(Profiler.RenderIncludes().ToString()))

<!-- ...other scripts... -->
</body>

我收到的错误:

  

[NullReferenceException:对象引用未设置为对象的实例。]

     

ServiceStack.MiniProfiler.UI.MiniProfilerHandler.RenderIncludes(Profiler profiler,Nullable 1 position, Nullable 1 showTrivial,Nullable 1 showTimeWithChildren, Nullable 1 maxTracesToShow,Boolean xhtml,Nullable`1 showControls,String path)+293

     

ServiceStack.MiniProfiler.Profiler.RenderIncludes(Nullable 1 position, Nullable 1 showTrivial,Nullable 1 showTimeWithChildren, Nullable 1 maxTracesToShow,Boolean xhtml,Nullable`1 showControls)+99

     

...

鉴于我正在努力完成基础知识,我不确定此时什么可能是null。在启动分析器之前是否需要某种额外的设置?这可能是路由问题吗?

1 个答案:

答案 0 :(得分:1)

这种情况下的解决方案似乎只是使用标准的MiniProfiler库而不是ServiceStack附带的库。

初始设置

在Nuget包安装程序中,我运行了:

Install-Package MiniProfiler
Install-Package MiniProfiler.MVC4

我通过以下方式修改了global.asax

private void Application_BeginRequest(object sender, EventArgs e)
{
        MiniProfiler.Start();
}

private void Application_AuthenticateRequest(object sender, EventArgs e)
{
     //stops the profiler if the user isn't on the tech team
    var currentUser = ClaimsPrincipal.Current.Identity as ClaimsIdentity;
    if (!Request.IsLocal && !currentUser.GetGlobalRoles().Contains(Constant.Roles.TechTeam))
    {
        MiniProfiler.Stop(discardResults:true);
    }
}

private void Application_EndRequest(object sender, EventArgs e)
{
    MiniProfiler.Stop();
}

然后,在我的Layout.cshtml文件中,在body标记结束之前,我放置了:

    @MiniProfiler.RenderIncludes()    

    </body>
</html>

分析数据库连接

在返回我的OrmLiteConnectionFactory的代码部分中,我使用以下代码:

    private OrmLiteConnectionFactory claimFactory = new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString(), true, SqlServerDialect.Provider)
     {
         ConnectionFilter = x => new ProfiledDbConnection(x as System.Data.SqlClient.SqlConnection, MiniProfiler.Current)
     };

这似乎可以很好地分析SQL和连接。