使用NCrawler的TypeInitializationException;缺少Autofac方法

时间:2016-07-14 09:34:27

标签: c# .net web-crawler console-application autofac


我正在用NCrawler做一些测试并得到了这个奇怪的异常:

  

' NCrawler.NCrawlerModule'的类型初始值设定项抛出一个例外。   内部异常是:找不到方法:' Void   Autofac.RegistrationExtensions.RegisterModule(Autofac.ContainerBuilder,   Autofac.Core.IModule)&#39 ;.

Crawlers构造函数中发生异常。

这是我的代码:

 static void Main(string[] args)
    {
        using (Crawler c = new Crawler(new Uri("http://stackoverflow.com"), new HtmlDocumentProcessor(), new TestStep()))
        {
            c.MaximumThreadCount = 3;
            c.MaximumCrawlDepth = 2;
            c.ExcludeFilter = new[] { new RegexFilter(
            new Regex(@"(\.jpg|\.css|\.js|\.gif|\.jpeg|\.png|\.ico)",
            RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase)) };
            c.Crawl();
        }
    }

这是TestStep类:

public class TestStep : IPipelineStep
{
    public void Process(Crawler crawler, PropertyBag propertyBag)
    {
        Console.Out.WriteLineAsync(propertyBag.Step.Uri.ToString());
    }
}

我尝试使用NuGet卸载并重新安装Autofac,但它不起作用。 奇怪的是,packages.config上的版本是3.5.2但是app.config上的版本似乎试图将其绑定到3.5.0。 这是packages.config中的AutoFac:

 <package id="Autofac" version="3.5.2" targetFramework="net452" />

并在app.config中:

<dependentAssembly>
    <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
  </dependentAssembly>

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

TypeInitializationException表示失败的静态构造函数。在这种情况下,NCrawlerModule上的静态构造函数失败。这是开始寻找的地方。

整个NCrawler项目看起来很混乱。

所有这一切的要点是你可能需要在你正在使用的NCrawler程序集上用dotPeek或你最喜欢的反编译器进行一些探索,看看你有什么那里。从问题或所有副本和不一致的地方来看,这一点并不明显。

无论如何,看看the static constructor on NCrawlerModule你看到它实际上是eventually trying to call a RegisterModule() extension method

现在,looking at Autofac.RegistrationExtensions in Autofac 3.5.2,当然,没有RegisterModule方法。在3.5.2中,该方法is in a ModuleRegistrationExtensions class,这就是您看到异常的原因: NCrawler正在寻找错误的位置。

可归结为你可能有一个针对Autofac 2.4.5编译的NCrawler版本而你正在尝试使用Autofac 3.x 。或者,至少,您有NCrawler并且您正在尝试使用 Autofac的某些版本,与该版本的NCrawler不兼容。

如果NuGet包正确指定了它使用的版本,你可能已经避免了这个问题,但是,再次看起来似乎与该项目存在一些混淆。

而且,再一次,您可以通过查看NCrawler程序集的反编译版本并检查它引用的内容来验证所有这些。我猜它是Autofac的旧版本。

您有两种方法可以解决问题。

  • 获取针对更新的Autofac编译的新版NCrawler。您可以说服那些项目维护人员更新他们的软件包,也可以自行分叉并自行完成。
  • 您可以找出您的NCrawler使用的旧版Autofac,并将整个应用程序回滚到旧的Autofac。这听起来很痛苦,因为你会被困在时间里。我个人而言,更愿意尝试让事情向前发展。

此外,希望您现在知道在将来看到这些异常时要从什么开始看:从静态构造函数开始,不要害怕在第三方源中开始使用。