EventData-Objekt mit Eigenschaften mithilfe der Azure-Funktion [EventHubOutput] zurückgeben
Posted: 08 Jan 2025, 10:16
Ich möchte in IFunctionsWorkerMiddleware eine Korrelations-ID festlegen für die Ausgabe eines Azure-Funktionstriggers, der EventHubOutput verwendet. Ich kann anscheinend keinen Weg finden, auf die Ereignisdaten zuzugreifen, die zurückgesendet werden, wenn ich EventHubOutput verwende.
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
Ereignisdaten zurückgeben
UPDATE hat Program.cs hinzugefügt, wie von Ikhtesam Afrin angefordert
UPDATE
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>

Ich bin auf diesen Beitrag gestoßen, der darauf hinweist, dass dies irgendwie möglich sein sollte. EventHubTrigger EventData[]-Bindung funktioniert nicht
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;
}