小编Mik*_*ike的帖子

为什么在EventSource的子类上实现接口会在运行时抛出异常?

我试图通过.NET 4.5中包含的EventSource类在我的.NET应用程序中使用事件跟踪Windows(ETW).我继承的,并试图实现一个接口(用于嘲讽的目的),如下所示:EventSourceMyEventSourceIMyEventSource

public interface IMyEventSource
{
  void Test();
}

public class MyEventSource : EventSource, IMyEventSource
{
  public static MyEventSource Log = new MyEventSource();

  [Event(1)]
  public void Test()
  {
    this.WriteEvent(1);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行PerfView并执行此代码时,我IndexOutOfRangeException接到了一个电话WriteEvent.如果我通过修改代码删除界面...

public class MyEventSource : EventSource
{
  public static MyEventSource Log = new MyEventSource();

  [Event(1)]
  public void Test()
  {
    this.WriteEvent(1);
  }
}
Run Code Online (Sandbox Code Playgroud)

...然后一切正常.

以下是我在两种情况下用于测试的代码:

static void Main(string[] args)
{
  MyEventSource.Log.Test();
}
Run Code Online (Sandbox Code Playgroud)

EventSource如果它只是实现一个接口,为什么我的子类会中断呢?

这是一篇相关的帖子.

etw .net-4.5 perfview etw-eventsource

8
推荐指数
2
解决办法
2038
查看次数

在解析公共类时注入内部帮助器类

我有以下架构,其中引用内部Helper类的公共服务类存在于另一个程序集中:

ApplicationAssembly {
  public class Widget {
    public Widget(ReferencedAssembly.Service service) { ... }
  }
}

ReferencedAssembly {
  public class Service {
    public Service(Helper helper) { ... }
  }
  class Helper { ... }
}
Run Code Online (Sandbox Code Playgroud)

(我意识到我不能在公共类的构造函数的参数中放入内部类 - 我只是想说明我正在追求的IoC模式.)

问题是ApplicationAssembly无法看到ReferencedAssembly.Helper,因此无法在我的IoC容器中注册(在本例中为Autofac).因此,Helper当我尝试解决时无法解决Service.这是我最好的选择?

  • 选项1:HelperService构造函数中删除并在构造函数中明确地将其新建.我不喜欢这个选项,因为它打破了IoC范式.

  • 选项2:使Helper实现成为公共IHelper接口,然后在ReferencedAssembly该寄存器中添加一个公共模块Helper作为IHelper.我不喜欢这个选项,因为它需要ApplicationAssembly知道太多的实现细节Service,如果用户忘记在启动时注册该模块,一切都会中断.

  • 选项3:创建一个公共静态构造函数Service,构建一个专门用于ReferencedAssemblyHelper在其中注册的第二个IoC容器.HelperService构造函数中删除并使用第二个IoC容器在构造函数中解析它.这似乎是我最好的选择,但需要比其他代码更多的"管道"代码.我也不是公共静态构造函数的忠实粉丝.

  • 选项4.将我的架构完全改为其他东西.

architecture dependency-injection inversion-of-control autofac

7
推荐指数
1
解决办法
3034
查看次数

如何在实体框架中控制参数嗅探和/或查询提示?

更新:我已经创建了一个建议,以便在EF的未来版本中实现提示控制.去这里投票吧.

我有一个问题,我的一个实体框架(EF)查询在Sql Server中执行需要很长时间,但是当我将生成的TSQL复制并粘贴到Sql Server Management Studio(SSMS)时,它运行得非常快.经过一些调查后,我发现我遇到了参数嗅探问题,正确的解决方法是插入许多查询提示之一(OPTIMIZE FOR,RECOMPILE等).如何将这些提示插入到我的EF查询中?

从不同角度出现的相关问题在这里,这里这里.

sql-server entity-framework query-hints parameter-sniffing

7
推荐指数
1
解决办法
4501
查看次数

在IIS URL Rewrite 2.0中,为什么HTTP_HOST包含端口号?

我试图在Windows 8.1上使用IIS URL Rewrite 2.0和IIS 8.5.根据重写规则访问URL部分,

For an HTTP URL in this form: http(s)://<host>:<port>/<path>?<querystring>

• The <path> is matched against the pattern of the rule.
• The <querystring> is available in the server variable called QUERY_STRING and can be accessed by using a condition within a rule.
• The <host> is available in the server variable HTTP_HOST and can be accessed by using a condition within a rule.
• The <port> is available in the server …
Run Code Online (Sandbox Code Playgroud)

url-rewriting url-rewrite-module

7
推荐指数
1
解决办法
6605
查看次数

多租户SQL Server数据库和参数嗅探

我在SQL Server 2012中有一个多租户数据库,其中每个租户的行由一tenant_id列(即共享数据库,共享模式方法)标识.一些租户,特别是较新的租户,行数很少,而其他租户则很多.

SQL Server的查询优化器通常根据第一次执行时提供的参数构建查询计划,然后即使提供了不同的参数,也可以将此计划重新用于所有将来的查询.这称为参数嗅探.

我们在数据库中遇到的问题是SQL Server有时会根据指向较小租户的参数构建这些计划,这对于该租户很有效,但是当它将缓存计划重新应用于更大的租户时,它会发生灾难性的失败(通常是时间安排)事实上).通常情况下,只有当我们的一个大租户与我们联系遇到超时错误时才会发现这种情况,然后我们必须进入系统并手动清除所有查询计划以纠正它.

您可以使用查询提示来阻止SQL Server缓存查询计划(OPTIMIZE FOR UNKNOWN),但这会导致一些额外的开销,因为每次调用查询时都会重新生成查询计划.另一个问题是我们使用的Entity Framework无法指定OPTIMIZE FOR UNKNOWN查询提示.

所以问题是 - 关于参数嗅探的多租户数据库的最佳实践是什么?有没有办法在数据库范围内禁用参数嗅探而无需在每个查询中指定它?如果是这样,这是最好的方法吗?我应该以其他方式对数据进行分区吗?还有其他一些我没想到的方法吗?

sql-server performance entity-framework parameter-sniffing multi-tenant

6
推荐指数
1
解决办法
8482
查看次数

如何在不丢失结构的情况下将 SSRS 矩阵导出为 CSV?

考虑以下数据源:

declare @Test table (EmpId int, ProdId int, Sold int)
insert @Test (EmpId, ProdId, Sold) values (1, 1, 1)
insert @Test (EmpId, ProdId, Sold) values (1, 2, 2)
insert @Test (EmpId, ProdId, Sold) values (1, 3, 3)
insert @Test (EmpId, ProdId, Sold) values (1, 4, 4)
insert @Test (EmpId, ProdId, Sold) values (2, 1, 5)
insert @Test (EmpId, ProdId, Sold) values (2, 2, 6)
insert @Test (EmpId, ProdId, Sold) values (2, 3, 7)
insert @Test (EmpId, ProdId, Sold) values (2, …
Run Code Online (Sandbox Code Playgroud)

csv export ssrs-2008 ssrs-tablix

5
推荐指数
1
解决办法
5341
查看次数

如何使用本地系统以外的帐户运行RavenDB作为服务?

我正在尝试安装RavenDB以作为Windows服务运行.默认情况下,它将自己设置为在本地系统帐户下运行,因此我尝试通过在专用帐户下运行来降低安全风险.我已经为程序目录c:\ Program Files\RavenDB和数据目录d:\ Data\RavenDB授予了对文件系统的完全访问权限.但是,当我尝试启动服务时,它立即失败,我在事件日志中收到以下错误:

RavenDB service failed to start because of an error
System.Net.HttpListenerException (0x80004005): Access is denied
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Raven.Database.Server.HttpServer.StartListening() in c:\Builds\RavenDB-Stable\Raven.Database\Server\HttpServer.cs:line 350
   at Raven.Server.RavenDbServer..ctor(RavenConfiguration settings) in c:\Builds\RavenDB-Stable\Raven.Server\RavenDbServer.cs:line 43
   at Raven.Server.RavenService.<OnStart>b__0() in c:\Builds\RavenDB-Stable\Raven.Server\RavenService.cs:line 37
Run Code Online (Sandbox Code Playgroud)

那么,如何配置用户运行RavenDB?我需要授予哪些权限?我已经检查了RavenDB文档和论坛,但没有在任何地方看到这个问题.

windows-services windows-authentication ravendb

2
推荐指数
1
解决办法
698
查看次数