Azure Eventlogs - TargetInvocationException和奇怪的消息

时间:2014-05-03 06:11:45

标签: c# .net asp.net-mvc iis azure

我很难将网站发布到Windows Azure,因此决定开启应用程序日志记录。

虽然站点的发布完成,但在Azure云上的应用程序启动期间会抛出异常;事件日志结果中的以下事件:

基本上,事件日志中的这一个特定事件有一些注意事项

  

TargetInvocationException

     

调用目标抛出了异常。在   System.RuntimeMethodHandle.InvokeMethod(Object target,Object []   参数,签名sig,布尔构造函数)at   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,   Object []参数,Object []参数)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)   在   Owin.Loader.DefaultLoader&LT;&GT; c__DisplayClass12.b__b(IAppBuilder   建设者)   Owin.Loader.DefaultLoader&LT;&GT; c__DisplayClass1.b__0(IAppBuilder   建设者)   Microsoft.Owin.Host.SystemWeb.OwinHttpModule&LT;&GT; c__DisplayClass2.b__0(IAppBuilder   建设者)   Microsoft.Owin.Host.SystemWeb.OwinAppContext.Initialize(动作1 startup) at Microsoft.Owin.Host.SystemWeb.OwinBuilder.Build(Action 1   启动)   Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint()at   System.Threading.LazyInitializer.EnsureInitializedCore [T](T&amp; target,   布尔和放大器;初始化,对象&amp; syncLock,Func 1 valueFactory) at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(HttpApplication context) at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) Could not load file or assembly 'Microsoft.Owin.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) at Owin.AppBuilderExtensions.UseExternalSignInCookie(IAppBuilder app, String externalAuthenticationType) at MySiteOnline.Startup.ConfigureAuth(IAppBuilder app) in c:\Users\Andre\Dropbox\Malty IT\Active Projects\MySiteOnline\MySiteOnline\App_Start\Startup.Auth.cs:line 20 at MySiteOnline.Startup.Configuration(IAppBuilder app) in c:\Users\Andre\Dropbox\Malty IT\Active at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Owin.Loader.DefaultLoader.<>c__DisplayClass12.<MakeDelegate>b__b(IAppBuilder builder) at Owin.Loader.DefaultLoader.<>c__DisplayClass1.<LoadImplementation>b__0(IAppBuilder builder) at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.<>c__DisplayClass2.<InitializeBlueprint>b__0(IAppBuilder builder) at Microsoft.Owin.Host.SystemWeb.OwinAppContext.Initialize(Action 1   启动)在Microsoft.Owin.Host.SystemWeb.OwinBuilder.Build(Action 1 startup) at Microsoft.Owin.Host.SystemWeb.OwinHttpModule.InitializeBlueprint() at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func 1 valueFactory)at at   Microsoft.Owin.Host.SystemWeb.OwinHttpModule.Init(HttpApplication的   上下文)   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr的   appContext,HttpContext上下文,MethodInfo []处理程序)at   System.Web.HttpApplication.InitSpecial(HttpApplicationState状态,   MethodInfo [] handlers,IntPtr appContext,HttpContext context)at   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr的   appContext,HttpContext context)at   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr的   appContext)

关于这条消息,有几件事引起了我的注意: 1.应用程序日志包含对硬盘驱动器/保管箱文件夹上文件的引用。这没有任何意义,因为这是云的部署运行! 2.由于某些我不知道的原因,该应用程序正在尝试加载Microsoft.Owin.Security版本2.0.0程序集,虽然我已经在我的项目中安装了版本2.1.0.0,复制local = true。我还在web.config中更新了我的程序集绑定,如下所示:

<dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security"            publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
      </dependentAssembly>

根据上面的堆栈跟踪,这里是导致错误抛出的代码:

 public partial class Startup
{
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //   consumerKey: "",
        //   consumerSecret: "");

        //app.UseFacebookAuthentication(
        //   appId: "",
        //   appSecret: "");

        //app.UseGoogleAuthentication();
    }
}

系统在我的开发环境中完美运行。

我认为我的思想可能已经被打破,试图解决这个难题。我也尝试在清单文件中挖掘并使用不同的nuget版本,但是唉...没有成功。

3 个答案:

答案 0 :(得分:1)

似乎问题与项目/清单文件因版本控制问题而损坏有关。我的假设是以下事件序列搞砸了:

  1. 更新了几个Nuget包

  2. 将代码推送到源代码管理。

  3. 从源代码管理中恢复以前版本的代码。

  4. 我相信在这个过程中的某个地方,config / manifest / dll文件没有以一致的方式处理,导致我遇到了群集。

    我的解决方案是恢复到我项目的早期工作版本,然后手动将代码更改合并到解决方案中(使用WinMerge)。

    虽然这是一项痛苦而耗时的活动,但这似乎解决了所有问题。

    任何人遇到类似问题的其他提示:

    1. 在“错误列表”窗口中启用“Wanrings”。

    2. 将构建输出详细程度设置为“详细”。在VS2013中,转到工具&gt;选项&gt;项目和解决方案&gt;构建并运行。将“MSBuild项目构建输出详细程度”的选项设置为“详细”。在构建之后检查输出是否存在任何冲突,因为这也将指出冲突组件的确切位置。 (为您的解决方案中的项目分配一个编号,并且与每个项目相关的操作将使用该编号进行相应标记)。

    3. 在Azure上为您的网站设置详细的应用程序日志记录。为此,请从Azure管理门户中选择您的站点,单击“配置”,然后向下浏览到“应用程序诊断”

答案 1 :(得分:0)

堆栈跟踪中的本地文件引用是正常的 - 这是构建解决方案的位置。

在try麻烦的代码周围放一个try / catch,然后遍历Exceptions(使用InnerException),直到找到实际的源代码。 TargetInvocationException只是告诉你代码抛出一个异常但是通过一些otehr机制调用了源代码(在你的情况下,我假设是通过一个IoC容器)。

我确保您正在部署Owin所需的所有相关程序集以实现功能 - 部分原因在于您可以在GAC或磁盘上安装所有程序集。

答案 2 :(得分:0)

大多数错误都是因为使用过的Azure-SDK不是最新的。我建议您尝试将您的站点升级到最新的Azure-SDK,目前版本为2.3。我建议你将所有NuGet软件包更新到最新版本。请不要使用任何预发行版本。

然后再次检查所有程序集引用,以查看是否每个程序集都设置为&#34; copy local&#34;。

为您的网站启用调试并使用新的部署插槽调试网站,这将使您能够创建暂存环境(如果您的网站当前没有您在此处发布的更改,但如果没有将网站推送到服务器)并开始调试。以下是有关如何远程调试Azure网站的文章(最新发布,9小时前发布):

How to Remotely Debug Azure Websites

如果在Azure上找不到程序集,那么另一种解决方法(这不是很好,但有时帮助我):

如果您有任何因任何原因无法找到的从属程序集,您可以尝试在您的网站项目中创建一个新文件夹,将这些程序集添加到该文件夹​​并设置他们的&#34;构建操作&#34 ;到&#34;内容&#34;并且&#34;永远复制&#34;。然后,您只需从Visual Studio解决方案中的文件夹中引用这些程序集。