Azure functions 使用ServiceBusTrigger访问Azure函数中TelemetryInitializer中的HttpContext
我正试图通过一个外部web服务的验证错误来丰富我的依赖关系遥测,这个外部web服务是我根据从服务总线触发器接收到的消息调用的 我尝试的是在我的Azure functions 使用ServiceBusTrigger访问Azure函数中TelemetryInitializer中的HttpContext,azure-functions,azure-application-insights,Azure Functions,Azure Application Insights,我正试图通过一个外部web服务的验证错误来丰富我的依赖关系遥测,这个外部web服务是我根据从服务总线触发器接收到的消息调用的 我尝试的是在我的Startup类中添加HttpContextAccessor,如下所示: public class Startup : IWebJobsStartup { public void Configure(IWebJobsBuilder builder) { builder.Services.AddHttpClient();
Startup
类中添加HttpContextAccessor
,如下所示:
public class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddHttpClient();
builder.Services.AddHttpContextAccessor();
builder.Services.AddSingleton<ITelemetryInitializer, BadRequestReasonTelemetryInitializer();
}
}
现在的问题是HttpContext
总是空的。我认为这很有意义,因为我有一个带有ServiceBusTrigger
的函数。但问题是如何从外部web服务调用中获取当前http上下文?有没有办法从DependencyTelemetry
中获取它?我的目标是.NETCore2.1和FunctionRuntime v2
编辑(为清晰起见,添加调用):
您将永远无法从外部web服务获取HttpContext。Azure函数实例正在另一台计算机上的整个其他进程中运行。你需要从上下文中得到什么信息?我明白了。我希望从响应主体中获取验证错误,并将其作为自定义属性附加到遥测数据中。实际上,@PeterBons您能详细说明一下该评论吗?我想我们可能误解了对方,因为我在最初的问题中写这句话的方式。我已经在实际函数中添加了一些调用的代码。这是我想作为属性添加到遥测中的来自该调用的响应主体。
public class BadRequestReasonTelemetryInitializer : ITelemetryInitializer
{
readonly IHttpContextAccessor _httpContextAccessor;
public BadRequestReasonTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void Initialize(ITelemetry telemetry)
{
if (telemetry is DependencyTelemetry req)
{
if (req.ResultCode == "400")
{
// toggle re-use
_httpContextAccessor.HttpContext.Request.EnableRewind();
var stream = new StreamReader(_httpContextAccessor.HttpContext.Request.Body);
var body = stream.ReadToEnd();
// reset stream to preserve data
_httpContextAccessor.HttpContext.Request.Body.Position = 0;
req.Properties.Add("Reason", body);
}
}
}
}
using (var httpClient = _httpClientFactory.CreateClient())
{
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);
using (var result = await httpClient.PostAsync($"{BaseUrl}/endpoint", payload))
{
// if the result is 400 I would like this to go to AI through the initializer
}
}