我很难将网站发布到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<> c__DisplayClass12.b__b(IAppBuilder 建设者) Owin.Loader.DefaultLoader<> c__DisplayClass1.b__0(IAppBuilder 建设者) Microsoft.Owin.Host.SystemWeb.OwinHttpModule<> 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,Func1 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(Action1 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版本,但是唉...没有成功。
答案 0 :(得分:1)
似乎问题与项目/清单文件因版本控制问题而损坏有关。我的假设是以下事件序列搞砸了:
更新了几个Nuget包
将代码推送到源代码管理。
从源代码管理中恢复以前版本的代码。
我相信在这个过程中的某个地方,config / manifest / dll文件没有以一致的方式处理,导致我遇到了群集。
我的解决方案是恢复到我项目的早期工作版本,然后手动将代码更改合并到解决方案中(使用WinMerge)。
虽然这是一项痛苦而耗时的活动,但这似乎解决了所有问题。
在“错误列表”窗口中启用“Wanrings”。
将构建输出详细程度设置为“详细”。在VS2013中,转到工具&gt;选项&gt;项目和解决方案&gt;构建并运行。将“MSBuild项目构建输出详细程度”的选项设置为“详细”。在构建之后检查输出是否存在任何冲突,因为这也将指出冲突组件的确切位置。 (为您的解决方案中的项目分配一个编号,并且与每个项目相关的操作将使用该编号进行相应标记)。
在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解决方案中的文件夹中引用这些程序集。