【问题标题】:Orleans unit test: Provider of type <> name Default was not loaded奥尔良单元测试:未加载类型 <> 名称默认值的提供程序
【发布时间】:2016-01-26 21:06:55
【问题描述】:

我遇到了以下问题。 我正在尝试为 Orleans grain 实施单元测试,但在启动时找不到 dataprovider Default。异常发生在构造函数调用上。这是代码: 单元测试类

   [TestFixture]
    public class SdxRemindersTest : TestingSiloHost
    {
        public SdxRemindersTest ()
            : base(new TestingSiloOptions
            {
                StartPrimary = true,
                StartSecondary = false,
                SiloConfigFile = new FileInfo("OrleansConfiguration.xml")

            }, new TestingClientOptions {ClientConfigFile = new FileInfo("ClientConfiguration.xml")})
        {
        }

// methods here.........
    }

这是我的配置文件 OrleansConfiguration.xml

<?xml version="1.0" encoding="utf-8"?>
<OrleansConfiguration xmlns="urn:orleans">
  <Globals>
    <StorageProviders>
      <Provider Type="NBOOC.Grains.StorageProviders.CustomSqlStorageProvider"
                          Name="Default"
                          Database=""
                          ConnectionString="" />

     </StorageProviders>
    <StreamProviders>
      <Provider Type="Orleans.Providers.Streams.SimpleMessageStream.SimpleMessageStreamProvider" Name="SMSProvider" FireAndForgetDelivery="false"/>
    </StreamProviders>
    <BootstrapProviders>
      <Provider Type="NBOOC.Grains.OrleansApp" Name="OrleansApp"   />
    </BootstrapProviders>
    <SeedNode Address="localhost" Port="22222"/>
    <Messaging ResponseTimeout="30s"/>
    <ReminderService ReminderServiceType="ReminderTableGrain"/>

  </Globals>
  <Defaults>
    <Networking Address="localhost" Port="22222"/>
    <ProxyingGateway Address="localhost" Port="40000" />
    <Tracing DefaultTraceLevel="Warning" TraceToConsole="true" TraceToFile="{0}-{1}.log" PropagateActivityId="false" BulkMessageLimit="1000">
      <TraceLevelOverride LogPrefix="Application" TraceLevel="Verbose3" />

      <LogConsumer>NBOOC.Grains.Utils.LogConsumer,NBOOC.Grains</LogConsumer>
    </Tracing>
    <Statistics MetricsTableWriteInterval="30s" PerfCounterWriteInterval="30s" LogWriteInterval="300s" WriteLogStatisticsToTable="true" StatisticsCollectionLevel="Info"/>
  </Defaults>
</OrleansConfiguration>

我遇到的错误是这样的:

Exc 级别 0:Orleans.Runtime.OrleansException:类型的提供者 NBOOC.Grains.StorageProviders.CustomSqlStorageProvider,NBOOC.Grains 名称默认未加载。请检查您是否部署了 将提供程序类定义为执行的程序集 文件夹。

在 Orleans.Providers.ProviderLoader`1.ValidateProviders()

在 Orleans.Providers.ProviderLoader1.LoadProviders(IDictionary2 配置,IProviderManager providerManager)

在 Orleans.Runtime.Storage.StorageProviderManager.LoadStorageProviders(IDictionary`2 配置)

在 Orleans.Runtime.Scheduler.SchedulerExtensions.c__DisplayClassa.d__c.MoveNext()

如您所见,有一个名称为 Default 且具有完全指定类型的提供程序。在那里指定的类是可访问的,因为所有引用都在那里 - 我已经明确检查过,所有 DLL-s 都放在与单元测试 DLL 相同的文件夹中。我还检查了 Orleans DLL 的所有版本——它们都是相同的 1.0.10.0,所以这不是版本问题。 有没有人遇到过这样的事情?任何想法如何解决它?

附:顺便说一句,如果你觉得它有帮助的话。我已经下载了奥尔良的源代码并追踪了发生异常的地方——有一个 ProviderLoader 类,它有一个提供者 Dictionary 的字典,但由于某种原因它是空的。

【问题讨论】:

    标签: c# unit-testing orleans


    【解决方案1】:

    如果有人觉得它有帮助。根本原因和可能的解决方案。 根本原因。出现问题是因为在启动测试时 OrleansRuntime 尝试执行以下操作:它获取程序集的位置并从它在其附近的文件夹中找到的所有 DLL-s 加载所有类型。 出现此问题的原因是 .NET 执行卷影复制并且不是从您的文件夹(即 \MyTestProject\bin\Debug)加载 DLL,而是从类似的东西加载 - C:\Users\__User__\AppData\Local\assembly\dl3\L1Q53XP9 .XXK\Y5C28WBO.YKY\ - 每个 DLL 都有文件夹。但正如我们所见,那里不会有 DLL-s(你的谷物)(例如 MemotyStorage 的 Orleans DLL),因此加载将失败。 可能的解决方案是以某种方式禁用此卷影复制 - 例如,它可以在 web.config 中设置。 但是对于单元测试仍然无法做到这一点。继续搜索。

    【讨论】:

    • 您需要指定复制到 TestResults out 文件夹的部署项(至少 mstest 是这样)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2014-05-19
    相关资源
    最近更新 更多