Возврат объекта EventData со свойствами с помощью функции Azure [EventHubOutput]C#

Место общения программистов C#
Ответить
Anonymous
 Возврат объекта EventData со свойствами с помощью функции Azure [EventHubOutput]

Сообщение Anonymous »

Я хочу установить идентификатор корреляции в IFunctionsWorkerMiddleware для выходных данных триггера функции Azure, использующего EventHubOutput. Кажется, я не могу найти способ получить доступ к данным событий, которые отправляются обратно при использовании EventHubOutput.
Я пытался манипулировать 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;
}
}
}
ОБНОВЛЕНИЕ добавило Program.cs по запросу Ихтесама Африна

Код: Выделить всё

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;
}
Я наткнулся на этот пост, в котором указано, что это должно быть возможно каким-то образом привязка EventHubTrigger EventData[] не работает

Подробнее здесь: https://stackoverflow.com/questions/793 ... thuboutput
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»