ASP.NET

编辑

快速入门

编辑

要为 ASP.NET(完整 .NET Framework)启用自动检测,您需要安装 Elastic.Apm.AspNetFullFramework 包,在您的 web.config 文件中添加对该包的引用,然后编译并部署您的应用程序。

  1. 确保您有权访问应用程序源代码并安装 Elastic.Apm.AspNetFullFramework 包。
  2. 通过添加 ElasticApmModule IIS 模块,在应用程序的 web.config 文件中引用 Elastic.Apm.AspNetFullFramework

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>
            <modules>
                <add name="ElasticApmModule" type="Elastic.Apm.AspNetFullFramework.ElasticApmModule, Elastic.Apm.AspNetFullFramework" />
            </modules>
        </system.webServer>
    </configuration>

    有两个可用的配置源。要了解更多信息,请参阅 ASP.NET 上的配置

    默认情况下,代理会为所有 HTTP 请求创建事务,包括静态内容:.html 页面、图像等。

    要仅为具有动态内容的 HTTP 请求(例如 .aspx 页面)创建事务,请将 managedHandler preCondition 添加到您的 web.config 文件中

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>
            <modules>
                <add name="ElasticApmModule" type="Elastic.Apm.AspNetFullFramework.ElasticApmModule, Elastic.Apm.AspNetFullFramework" preCondition="managedHandler" />
            </modules>
        </system.webServer>
    </configuration>

    要了解有关添加模块的更多信息,请参阅 Microsoft 文档

我们的 IIS 模块需要

  • IIS 7 或更高版本
  • 应用程序池的管道模式必须设置为集成(IIS 7 及更高版本的默认设置)
  • 已部署的 .NET 应用程序不能在怪癖模式下运行。这使得 LegacyAspNetSynchronizationContext 成为异步上下文处理程序,并且可能导致 HttpContext.Items 在异步代码引入线程切换时无法正确恢复。
  1. 重新编译您的应用程序并进行部署。

    ElasticApmModule 在第一次初始化时实例化 APM 代理。但是,在某些情况下,您可能希望控制代理的实例化,例如在应用程序启动时配置过滤器。

    为此,ElasticApmModule 公开了一个 CreateAgentComponents() 方法,该方法返回配置为与 ASP.NET Full Framework 一起使用的代理组件,然后可以使用这些组件实例化代理。

    例如,您可以在应用程序启动时向代理添加事务过滤器

    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            // other application startup e.g. RouteConfig, etc.
    
            // set up agent with components
            var agentComponents = ElasticApmModule.CreateAgentComponents();
            Agent.Setup(agentComponents);
    
            // add transaction filter
            Agent.AddFilter((ITransaction t) =>
            {
                t.SetLabel("foo", "bar");
                return t;
            });
        }
    }

    现在,ElasticApmModule 将在初始化时使用已实例化的 APM 代理实例。