Wie kann ich die HTTP -Antwort mit Middleware in Azure -Funktionen protokollieren, die den isolierten Prozess von .NET 8C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann ich die HTTP -Antwort mit Middleware in Azure -Funktionen protokollieren, die den isolierten Prozess von .NET 8

Post by Anonymous »

Ich bin dabei, meine Azurefunktion von In-Process zu isoliertem Prozess zu migrieren. app.UseHttplogging (); , um die HTTP -Anforderungen und Antworten zu protokollieren. Leider scheint dies nicht möglich zu sein, da die zweite Aussage in der IHOST nicht verfügbar ist, die ich beim Aufrufen von .build () auf dem Hostbuilder zurückrufen kann. Gethttpresponsedata () Aus dem Funktionscontext igen "System.ArgumentException: 'Stream war nicht lesbar'" Da der zugrunde liegende Streamwriter entsorgt wurde. Körper, aber dann ist die Antwort an den Endbenutzer/Anrufer zurückgegeben, ist jetzt immer leer.

Code: Select all

public class RequestResponseLoggingMiddleware : IFunctionsWorkerMiddleware
{
private readonly ILogger logger;

public RequestResponseLoggingMiddleware(ILogger logger)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}

public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
var request = await context.GetHttpRequestDataAsync();
string requestBody = await new StreamReader(request!.Body).ReadToEndAsync();
logger.LogInformation("RequestBody: {requestBody}", requestBody);

await next(context);

var response = context.GetHttpResponseData();
string responseBody = await new StreamReader(response!.Body).ReadToEndAsync();
logger.LogInformation("ResponseBody: {responseBody}", responseBody);
}
}
Der 'Stream war nicht lesbar' Fehler:

, hier ist der Code, der den Code ersetzt, das Antwortstrom mit meinem eigenen Speicher, der mit meinem eigenen Speicher -Stream mit My Own My Own ersetzt wird. Benutzer/Anrufer:

Code: Select all

public class RequestResponseLoggingMiddleware : IFunctionsWorkerMiddleware
{
private readonly ILogger logger;

public RequestResponseLoggingMiddleware(ILogger logger)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}

public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
var request = await context.GetHttpRequestDataAsync();
string requestBody = await new StreamReader(request!.Body).ReadToEndAsync();
logger.LogInformation("RequestBody: {requestBody}", requestBody);

using (MemoryStream openResponseBody = new MemoryStream())
{
var httpContext = context.GetHttpContext();
httpContext!.Response.Body = openResponseBody;

await next(context);

var response = context.GetHttpResponseData();
string responseBody = await GetResponseBody(response!.Body);
logger.LogInformation("ResponseBody: {responseBody}", responseBody);
}
}

private async Task GetResponseBody(Stream responseBody)
{
responseBody.Seek(0, SeekOrigin.Begin);
return await new StreamReader(responseBody).ReadToEndAsync();
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post