我正在尝试使用(真棒)mvc-mini-profiler和一些预先存在的SqlConnection存储过程代码(我们不使用EF或L2S,只使用ADO.NET到SQL Server 2008).我正在寻找关于如何将继承ProfiledDb类型集成到这种代码中的一些指导.
var con = new SqlConnection("connectionstring");
var cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.CommandText = "SP_STORED_PROCEDURE_NAME";
cmd.Paramters.Add("recordsetid",SqlDbType.UniqueIdentifier).Value = recordsetid;
var dSet = new DataSet();
var da = new SqlDataAdapter(cmd);
da.fill(dSet);
<parse DataSet>
Run Code Online (Sandbox Code Playgroud)
对于我们遗留的ADO.NET用户来说,任何帮助都会很棒,因为从表面上看,SQL分析器应该适用于这种情况
我刚开始尝试使用EF4.1在我的MVC3项目中使用mvc-mini-profiler,之后我 MiniProfilerEF.Initialize();改为MiniProfilerEF.Initialize_EF42();:
在"MvcMiniProfiler.Data.EFProfiledOdbcProviderFactory"类型的商店提供程序实例上调用"GetService"方法后返回null.商店提供商可能无法正常运行.
这个方法MiniProfilerEF.Initialize(); - 给了我
给定的程序集名称或代码库无效.(HRESULT异常:0x80131047)
所以我用已经从源手动构建的dll替换了dll.
这可能是什么问题?
我首先在我的mvc3项目中使用EF 4.2代码.
miniprofiler工作得很好(sql + mvc),但是我遇到了异步任务的问题.
我用这种方式表演(这个方法好吗?我对此感到有点不安new DatabaseContext())
public static void PerformAsycAction(this User user, Action<User> action)
{
ThreadPool.QueueUserWorkItem(_ =>
{
var context = new DatabaseContext();
MiniProfilerEF.Initialize();
var consistantUser = context.Set<User>().Get(user.Id);
action(consistantUser);
context.SaveChanges();
});
}
Run Code Online (Sandbox Code Playgroud)
我在Application_Start中有适当的行:
protected void Application_Start()
{
MiniProfilerEF.Initialize();
...
}
Run Code Online (Sandbox Code Playgroud)
在db的第一个操作期间抛出了一个excpetion,action(consistantUser);
这里是跟踪:
在MvcMiniProfiler.MiniProfiler.AddSqlTiming(SqlTiming stats)中的C:\ Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\MiniProfiler.cs:MvcMiniProfiler.SqlTiming..ctor中的第274行(DbCommand命令,ExecuteType类型,MiniProfiler profiler) )在C:\ Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\SqlTiming.cs:第137行,位于C:\ Users\sam\Desktop\mvc-中的MvcMiniProfiler.SqlProfiler.ExecuteStartImpl(DbCommand命令,ExecuteType类型) mini-profiler\MvcMiniProfiler\SqlProfiler.cs:第39行,位于C:\ Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\SqlProfiler.cs中的MvcMiniProfiler.SqlProfilerExtensions.ExecuteStart(SqlProfiler sqlProfiler,DbCommand命令,ExecuteType类型):位于MvcMiniProfiler的C:\ Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\MiniProfiler.IDbProfiler.cs:第14行的MvcMiniProfiler.MiniProfiler.MvcMiniProfiler.Data.IDbProfiler.ExecuteStart(DbCommand profiledDbCommand,ExecuteType executeType)第93行. Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehavior behavior)in C:\ Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands上System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)的第158行( EntityCommand entityCommand,CommandBehavior行为)
我究竟做错了什么?任何帮助将不胜感激.
编辑:我尝试再次初始化MiniProfiler(MiniProfilerEF.Initialize();),在执行backgroung任务的线程中(在启动DatabaseContext之前),现在还有另一个例外:
无法将"MvcMiniProfiler.Data.EFProfiledDbConnection"类型的对象强制转换为"System.Data.SqlClient.SqlConnection"类型
实际上,在后台线程中对查询进行概要分析并不是必需的,但它会导致整个线程崩溃,因此应用程序无法正常工作,我不得不讨论整个分析器.有没有办法为它,后台,线程禁用它以防止它崩溃?
当我点击个人资料的分享链接时,我收到以下异常.我正在使用NuGet的最新版本,2.0.1.
System.NullReferenceException: Object reference not set to an instance of an object.
at StackExchange.Profiling.Storage.SqlServerStorage.LoadInBatch(DbConnection conn, Object idParameter) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\Storage\SqlServerStorage.cs:line 348
at StackExchange.Profiling.Storage.SqlServerStorage.Load(Guid id) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\Storage\SqlServerStorage.cs:line 297
at StackExchange.Profiling.UI.MiniProfilerHandler.Results(HttpContext context) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\UI\MiniProfilerHandler.cs:line 314
at StackExchange.Profiling.UI.MiniProfilerHandler.ProcessRequest(HttpContext context) in C:\Users\sam\Desktop\MiniProfiler\StackExchange.Profiling\UI\MiniProfilerHandler.cs:line 188
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Run Code Online (Sandbox Code Playgroud)
我发现,我认为是在代码中的空引用的来源在这里:
ClientTimings clientTimings = null;
if (clientTimingList.Count > 0)
{
clientTimings.Timings = clientTimingList;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么,或者当有条目时总是会抛出异常clientTimingList?
我想也许如果我禁用批处理,我不会运行LoadInBatch函数,但LoadIndividually有同样的问题.
我找了一种方法来禁用客户端计时,但找不到它的设置.
也许我可以在数据库中设置一个触发器来删除行,但这似乎有点极端.
如果我有时间,我会得到代码并提交拉取请求.我想先确保我没有遗漏任何明显的东西.
我在一个新的MVC4站点上安装了Mini-Profiler,并注意到某些Find: DisplayTemplates包括String和DateTime在内的大量等待时间.以下是一个例子.在另一个问题中,Sam Saffron谈到了寻找步骤
在随后的运行中它很快(除非你有一些非常糟糕的事情发生)
但是每个页面加载都会发生以下情况:
http://localhost:80/SLS.Site/s/hogwarts/lunch... 2.6 +0.0
Check School Permissions 2.4 +2.0 1 sql 0.9
Controller: SchoolAdmin.LunchGroupsController... 4.0 +4.5
Find: Index 0.4 +8.6
Render : Index 70.0 +9.1 2 sql 13.0
Controller: SchoolAdmin.LunchGroupsController... 2.6 +12.3
Find: BuildingTree 0.4 +14.9
Render partial: BuildingTree 4.4 +15.4 1 sql 3.2
Controller: SchoolAdmin.LunchGroupsController... 3.3 +20.2
Find: Teachers 0.6 +23.6
Render partial: Teachers 4.3 +24.3 1 sql 2.4
Find: DisplayTemplates/String 409.3 +31.9
Render partial: _UserContext 0.0 +441.3
Find: _LoginPartial 1.2 +441.4
Render …Run Code Online (Sandbox Code Playgroud) 我相信mvc mini profiler会将所有响应时间存储在HttpRuntime缓存中.
如果我错了请告诉我,但如果是这样的话,那么这个缓存的最大限制是多少?在缓存已满之前,它可以分析多少个操作?我们使用迷你探查器来分析测试套件的操作,测试套件会随着时间的推移而增长,所以我很担心这个问题.我应该担心吗?
在相关的说明.当所有测试都被分析后,我只需在迷你探查器的类中调用该Save方法SqlServerStorage.并且所有响应时间都保存到SQL Server数据库中.有没有什么方法可以Save更频繁地调用该方法而无需一次又一次地启动和停止探查器?我们只是在测试套件的开头启动它,并在所有测试都被分析后结束它.我们将该MiniProfilers表的一个条目视为一个分析会话.现在我不能多次调用'Save'方法,因为MiniProfilerId每次调用它都需要一个新的方法.
有什么建议?
我想不时使用MiniProfiler来分析我的代码,但我不想分支并继续重新引入它; 我想把它留在那里,@MiniProfiler.RenderIncludes()当我不使用它时,只是从我的布局模板中删除调用.但是,我的代码仍然如下所示:
using (MiniProfiler.Current.Step("Generate events index view model")) {
_thisStep = MiniProfiler.Current.Step("Check query string");
int pageIndex = 0;
// Do check...
_thisStep.Dispose();
// Do other stuff...
}
Run Code Online (Sandbox Code Playgroud)
将这些Steps留在那里并处理它们需要多少开销?有没有办法告诉MiniProfiler我没有使用它,所以Step基本上什么也没做,但我仍然可以把它留在我的代码中?
我正在使用MiniProfiler来配置我的sql命令.
我正在处理的一个问题是由linq生成的重复INSERT语句.
我已将它们转换为SqlBulkCopy命令,但现在它似乎没有将它记录在MiniProfiler的sql视图中.
是否会为SqlBulkCopy提供相关的命令字符串?
是否可以将批量副本显示在sql命令列表中?
我至少可以在%sql位中计算它吗?
我知道我可以使用MiniProfiler.Current.Step("Doing Bulk Copy")但不会算作SQL,并且不会在列表中显示任何细节.
目前的代码如下:
public static void BulkInsertAll<T>(this DataContext dc, IEnumerable<T> entities)
{
var conn = (dc.Connection as ProfiledDbConnection).InnerConnection as SqlConnection;
conn.Open();
Type t = typeof(T);
var tableAttribute = (TableAttribute)t.GetCustomAttributes(
typeof(TableAttribute), false).Single();
var bulkCopy = new SqlBulkCopy(conn)
{
DestinationTableName = tableAttribute.Name
};
//....
bulkCopy.WriteToServer(table);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将MiniProfiler用于使用Oracle DB的MVC应用程序.这是我的global.asax.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
MiniProfiler.Start(); //or any number of other checks, up to you
}
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
DevExpressHelper.Theme = "Metropolis";
MiniProfiler.Stop(); //stop as early as you can, even earlier with MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);
}
Run Code Online (Sandbox Code Playgroud)
申请开始时,我得到:
"请求在此上下文中不可用"
我有两个独立的项目"MyWeb"和"MyAPI",MyWEB是一个单页的站点,有一个控制器和一个视图,它基于淘汰MVVM和ajax请求到MyAPI Web应用程序,这两个项目包含在不同的apppools.我已经将MiniProfiler与MyWEB网站集成在一起并且运行良好,但我只能看到主页的首次加载结果,然后所有数据都从MyAPI网络应用加载.所以,我需要将MiniProfiler与MyAPI项目集成,我有能力在MyWEB网站的页面上看到miniprofiler结果.我知道MiniProfiler发送ajax请求获取结果,但我不明白为什么这个请求只能在同一个域上工作.例如,MyWEB在domaint http://mywebsite.com,我向域中的MyAPI发送请求http://mywebapi.com/api,这两个项目也可以放在两台不同的计算机上.那么,我现在所拥有的
MyWEB global.asax
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
MiniProfilerEF6.Initialize();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AreaRegistration.RegisterAllAreas();
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
}
protected void Application_EndRequest()
{
}
}
Run Code Online (Sandbox Code Playgroud)
MyAPI global.asax
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
MiniProfilerEF6.Initialize();
GlobalConfiguration.Configure(WebApiConfig.Register);
AreaRegistration.RegisterAllAreas();
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.IsLocal)
{
MiniProfiler.Start();
}
}
protected void Application_EndRequest()
{
MiniProfiler.Stop();
}
}
Run Code Online (Sandbox Code Playgroud)
MyAPI web.config处理程序
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" …Run Code Online (Sandbox Code Playgroud) asp.net ajax mvc-mini-profiler asp.net-mvc-4 asp.net-web-api
asp.net-mvc ×3
c# ×3
asp.net ×2
ado.net ×1
ajax ×1
performance ×1
sql-server ×1
sqlbulkcopy ×1