使用Application Insights Status Monitor Preview向应用程序添加洞察时的异常运行应用程序

时间:2014-12-11 17:08:04

标签: azure-application-insights

我正在使用预览,并尝试在我的计算机上本地部署的IIS Web应用程序中添加见解。它是一个在非常规应用程序池中运行的.Net 4.5应用程序。在添加见解后启动应用程序时,我遇到了以下异常:

无法加载文件或程序集' Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll'或其中一个依赖项。该模块应该包含一个程序集清单。

我尝试了#34;启用32位应用程序"无论是真还是假都没有结果。

有没有人遇到过类似的错误?

5 个答案:

答案 0 :(得分:0)

不幸的是,ASP.NET试图将\ bin中的所有内容加载为托管程序集 Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll 不是托管程序集,但在这种情况下,ASP.NET Web App不应该以黄页失败,您只能在FusLogvw中看到它。

您使用任何网络发布吗? 您是否在发布时预编译了您的网站?

你能提供异常的完整堆栈跟踪吗?

答案 1 :(得分:0)

我还在测试这个,但我认为我已经解决了这个问题....

该解决方案基于与SQL Spatial Types native .dll解决方案相同的解决方案;如果你知道这一点,你会看到这个和那个包之间的相似之处。

第1步

Go在MVC项目中创建一个新的子目录,并在这两个子目录下创建;我用过:

MVCRoot ---> ApplicationInsights/x86
        ---> ApplicationInsights/x64

在每个目录下添加包目录中的链接项,即:

  

../ packages \ Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.0.12.0-build02810 \ lib \ native \ x64 \ Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll

  

../ packages \ Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.0.12.0-build02810 \ lib \ native \ x86 \ Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll

分别

然后我将此代码添加到' root'中的文件中。 AppplicationInsights文件夹名为loader.cs,如下所示:

using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;

namespace ApplicationInsights
{
    /// <summary>
    /// Utility methods related to CLR Types for SQL Server 
    /// </summary>
    internal class Utilities
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr LoadLibrary(string libname);

        /// <summary>
        /// Loads the required native assemblies for the current architecture (x86 or x64)
        /// </summary>
        /// <param name="rootApplicationPath">
        /// Root path of the current application. Use Server.MapPath(".") for ASP.NET applications
        /// and AppDomain.CurrentDomain.BaseDirectory for desktop applications.
        /// </param>
        public static void LoadNativeAssemblies(string rootApplicationPath)
        {
            var nativeBinaryPath = IntPtr.Size > 4
                ? Path.Combine(rootApplicationPath, @"ApplicationInsights\x64\")
                : Path.Combine(rootApplicationPath, @"ApplicationInsights\x86\");

            CheckAddDllPath(nativeBinaryPath);

        //    LoadNativeAssembly(nativeBinaryPath,
        //        IntPtr.Size > 4
        //            ? "Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll"
        //            : "Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll");
        }

        public static void CheckAddDllPath(string dllPath)
        {
            // find path to 'bin' folder
            var pathsToAdd = Path.Combine(new string[] { AppDomain.CurrentDomain.BaseDirectory, dllPath });
            // get current search path from environment
            var path = Environment.GetEnvironmentVariable("PATH") ?? "";

            // add 'bin' folder to search path if not already present
            if (!path.Split(Path.PathSeparator).Contains(pathsToAdd, StringComparer.CurrentCultureIgnoreCase))
            {
                path = string.Join(Path.PathSeparator.ToString(), new string[] { path, pathsToAdd });
                Environment.SetEnvironmentVariable("PATH", path);
            }
        }
        private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
        {
            var path = Path.Combine(nativeBinaryPath, assemblyName);
            var ptr = LoadLibrary(path);
            if (ptr == IntPtr.Zero)
            {
                throw new Exception(string.Format(
                    "Error loading {0} (ErrorCode: {1})",
                    assemblyName,
                    Marshal.GetLastWin32Error()));
            }
        }
    }
}

然后我将此添加到global.asax中:

        protected override void Application_Start(object sender, EventArgs e)
        {
            ApplicationInsights.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));    
        }

到目前为止,到目前为止我似乎已经通过了事件。如果我发现我所做的事情有问题,所有人都会回来更新。

至少MVC应用程序现在开始: - )

更新:这不是故事的结尾: - (

我还必须修改程序包的build目录下的Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.props文件,使其不包含bin目录中的文件。

当我完成时,它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
      <None Include="$(MSBuildThisFileDirectory)\..\lib\native\x86\Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll">
        <CopyToOutputDirectory>None</CopyToOutputDirectory>
      </None>
      <None Include="$(MSBuildThisFileDirectory)\..\lib\native\x64\Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll">
        <CopyToOutputDirectory>None</CopyToOutputDirectory>
      </None>
  </ItemGroup>
</Project>

我必须将此软件包签入我的源代码管理系统,因为我认为我现在将面临继续构建恢复该软件包的新副本的问题。 ;想要。

我无法等待MS为此提出正确的解决方法。

答案 2 :(得分:0)

我刚刚遇到过这个问题,几个小时后发现这是由于与FluentSecurity发生冲突。

此处详细说明:https://github.com/kristofferahl/FluentSecurity/issues/70

解决方法是在调用SecurityConfigurator.Configure()之前添加以下行:

SecurityDoctor.Current.EventListenerScannerSetup = scan =>
{
    scan.ExcludeAssembly(file => Path.GetFileName(file).Equals("Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll"));
    scan.ExcludeAssembly(file => Path.GetFileName(file).Equals("Microsoft.ApplicationInsights.Extensions.Intercept_x86.dll"));
};

希望这有助于其他人。

答案 3 :(得分:0)

我的内部异常指向WebActivator。所以我Uninstall-Package WebActivator -Force,在Application_Start中添加了适当的调用,一切都很好。

答案 4 :(得分:0)

我刚删除了/ bin文件夹中的所有内容,似乎已经解决了问题。不知道发生了什么或什么,这是一个我多年没有触及过的项目。但它解决了它:)