Ich habe versucht, das InvocationResult zu manipulieren, aber Das heißt, welches Objekt auch immer vom Trigger zurückgegeben wurde (kein Zugriff auf Metadaten).
Ich habe auch versucht, ein EventData-Objekt vom Trigger zurückzugeben (gleicher Typ, der als Eingabe von EventHubTrigger verwendet wird), aber das wird einfach in einen String serialisiert „Azure.Messaging.EventHubs.EventData“ zum EH-Thema und nicht zum eigentlichen EventData-Objekt
Irgendeine Idee, wie man Header/Eigenschaften in EventHubOutput-Bindungen festlegt Funktions-Middleware?
InvocationResult verwenden
Code: Select all
[Function("MyFunction")]
[EventHubOutput("output", Connection = "output-connection")]
public async Task Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req)
{
return "my payload";
}
Code: Select all
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
}
}
Code: Select all
[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;
}
Code: Select all
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;
}
}
}
Code: Select all
var builder = FunctionsApplication.CreateBuilder(args);
builder.ConfigureFunctionsWebApplication();
builder.UseMiddleware();
builder.Services
.AddApplicationInsightsTelemetryWorkerService()
.ConfigureFunctionsApplicationInsights();
builder.Build().Run();
Ich glaube, der Kern dieses Problems liegt darin, dass [EventHubOutput] dazu nicht in der Lage ist Gibt ein EventData-Objekt zurück. Bei der Rückgabe eines EventData-Objekts scheint es so, als ob es lediglich durch Ausführen von .ToString() auf den EventHub gestellt würde, da die Nutzlast der Nachricht Azure.Messaging.EventHubs.EventData ist.< /p>

Code: Select all
[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;
}