Я пытался манипулировать InvokeResult, но то есть любой объект, возвращаемый из триггера (без доступа к метаданным).
Я также пробовал вернуть объект EventData из триггера (тот же тип, который используется в качестве входных данных из EventHubTrigger), но это просто сериализуется в строку "Azure.Messaging.EventHubs.EventData" в теме EH, а не в реальном объекте EventData
Есть идеи о том, как установить заголовки/свойства в привязках EventHubOutput в Промежуточное программное обеспечение функции?
Использование InvokeResult
Код: Выделить всё
[Function("MyFunction")]
[EventHubOutput("output", Connection = "output-connection")]
public async Task Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req)
{
return "my payload";
}
Код: Выделить всё
public class CorrelationMiddleware : IFunctionsWorkerMiddleware
{
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
await next(context);
SetOutputCorrelation(context);
}
private void SetOutputCorrelation(FunctionContext context)
{
var correlationId = Guid.NewGuid().ToString();
var result = context.GetInvocationResult();
// result is just the string returned from trigger - no access to metadata
}
}
Код: Выделить всё
[Function("MyFunction")]
[EventHubOutput("output", Connection = "output-connection")]
public async Task Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req)
{
var payload = "my payload";
var eventData = new EventData(Encoding.UTF8.GetBytes(payload));
// if return type is EventData, it doesnt get properly serialized on the EventHub topic, it's just a .ToString() so it ends up as a message with payload as string "Azure.Messaging.EventHubs.EventData"
return eventData;
}
Код: Выделить всё
public class CorrelationMiddleware : IFunctionsWorkerMiddleware
{
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
await next(context);
SetOutputCorrelation(context);
}
private void SetOutputCorrelation(FunctionContext context)
{
var correlationId = Guid.NewGuid().ToString();
var result = context.GetInvocationResult();
if (result.Value is EventData eventData)
{
eventData.Properties["correlation-id"] = correlationId;
}
}
}
Код: Выделить всё
var builder = FunctionsApplication.CreateBuilder(args);
builder.ConfigureFunctionsWebApplication();
builder.UseMiddleware();
builder.Services
.AddApplicationInsightsTelemetryWorkerService()
.ConfigureFunctionsApplicationInsights();
builder.Build().Run();
Я считаю, что суть этой проблемы заключается в том, что [EventHubOutput] не может вернуть объект EventData. При возврате объекта EventData кажется, что он просто помещен в EventHub с помощью .ToString(), поскольку полезная нагрузка сообщения — Azure.Messaging.EventHubs.EventData.< /p>

Код: Выделить всё
[Function("Function1")]
[EventHubOutput("output", Connection = "output-connection")]
public EventData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req)
{
var data = new EventData("test payload")
{
Properties =
{
{ "CorrleationId", "123" }
}
};
var str = data.ToString(); // -> "Azure.Messaging.EventHubs.EventData"
return data;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... thuboutput
Мобильная версия