Привет, я пытаюсь напечатать в консоли HttpRequestData и HttpResponseData, используя промежуточное программное обеспечение для функций Azure (изолированное).
Я могу правильно получить значение HttpRequestData, но значение ответа всегда пустое "".
Мое промежуточное программное обеспечение:
public class HistoryLogMiddleware : IFunctionsWorkerMiddleware
{
public HistoryLogMiddleware() { }
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
var requestData = await context.GetHttpRequestDataAsync();
var body = await new StreamReader(requestData.Body).ReadToEndAsync();
Console.WriteLine($"Request Body: {body}");
requestData.Body.Position = 0;
await next(context);
var responseData = context.GetInvocationResult();
if (responseData != null && responseData.Value is HttpResponseData)
{
var responseFormat = (HttpResponseData)responseData.Value;
var responseBody = await new StreamReader(responseFormat.Body).ReadToEndAsync();
Console.WriteLine($"Response Body: {responseBody}");
responseFormat.Body.Position = 0;
}
}
}
Мой пример функции:
[Function(nameof(RegisterClientFunction))]
public async Task<HttpResponseData> RunAsync(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
var data = JsonConvert.DeserializeObject<RegisterClientRequest>(requestBody);
var respDomain = await ExecuterDomain.ExecuteAsync(() => _clientsDomain.RegisterClient(data));
var response = req.CreateResponse((HttpStatusCode)respDomain.Status);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
await response.WriteStringAsync(JsonConvert.SerializeObject(respDomain).ToString(), Encoding.UTF8);
return response;
}
Кто-нибудь знает, как получить значение ответа в промежуточном программном обеспечении?





Вы можете получить тело ответа, внеся несколько изменений в файл HistoryLogMiddleware.
Я могу получить тело ответа, используя приведенный ниже код:
using Azure;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.Functions.Worker.Middleware;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _78438359
{
public class HistoryLogMiddleware : IFunctionsWorkerMiddleware
{
public HistoryLogMiddleware() { }
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
var requestData = await context.GetHttpRequestDataAsync();
var body = await new StreamReader(requestData.Body).ReadToEndAsync();
Console.WriteLine($"Request Body: {body}");
requestData.Body.Position = 0;
await next(context);
var response = context.GetHttpResponseData();
if (response != null)
{
var responseBody = await GetResponseContentAsync(response);
Console.WriteLine($"Response Body: {responseBody}");
}
}
private async Task<string> GetResponseContentAsync(HttpResponseData response)
{
string stringResp = string.Empty;
if (response.Body != null)
{
response.Body.Position = 0;
stringResp = await new StreamReader(response.Body).ReadToEndAsync();
}
return stringResp;
}
}
}
У меня есть код ниже в файле RegisterClientFunction.
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Net;
using System.Text;
namespace _78438359
{
public class RegisterClientFunction
{
public RegisterClientFunction() { }
[Function(nameof(RegisterClientFunction))]
public async Task<HttpResponseData> RunAsync(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req)
{
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
var data = JsonConvert.DeserializeObject<RegisterClientRequest>(requestBody);
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
await response.WriteStringAsync("Client registered successfully.", Encoding.UTF8);
return response;
}
}
}
Я могу получить ожидаемый ответ, как показано ниже:

Azure Functions Core Tools
Core Tools Version: 4.0.5700 Commit hash: N/A +71cc84964a60bfb07d95839b7c666bd239507bdd (64-bit)
Function Runtime Version: 4.33.2.22572
[2024-05-09T03:26:15.626Z] Found C:\Users\******\78438359\78438359\78438359.csproj. Using for user secrets file configuration.
[2024-05-09T03:26:23.593Z] Azure Functions .NET Worker (PID: 13132) initialized in debug mode. Waiting for debugger to attach...
[2024-05-09T03:26:23.677Z] Worker process started and initialized.
Functions:
RegisterClientFunction: [POST] http://localhost:7295/api/RegisterClientFunction
For detailed output, run func with --verbose flag.
[2024-05-09T03:26:28.922Z] Host lock lease acquired by instance ID '000000000000000000000000BF6D1ED5'.
[2024-05-09T03:27:02.991Z] Executing 'Functions.RegisterClientFunction' (Reason='This function was programmatically called via the host APIs.', Id=87bf48e4-8ca8-4cbe-a6c0-f8a69c0ad39c)
[2024-05-09T03:27:03.354Z] Request Body: {
[2024-05-09T03:27:03.357Z] "Name": "Afreen"
[2024-05-09T03:27:03.359Z] }
[2024-05-09T03:27:03.710Z] Response Body: Client registered successfully.
[2024-05-09T03:27:03.951Z] Executed 'Functions.RegisterClientFunction' (Succeeded, Id=87bf48e4-8ca8-4cbe-a6c0-f8a69c0ad39c, Duration=1022ms)
Пожалуйста, добавьте и измените свой код следующим образом: Private async Task<string> GetResponseContentAsync(HttpResponseData response) { string stringResp = string.Empty; если (response.Body!= null) {Response.Body.Position = 0; stringResp = ожидайте нового StreamReader(response.Body).ReadToEndAsync(); } Вернуть stringResp; }
@Droscar изменил мой ответ
Но как я могу по-прежнему возвращать исходный ответ? Я не хочу изменять обратный ответ, например, если мой ответ был: {"Сообщение": "Привет, новый пользователь"}, я хочу увидеть это в консоли и ответ для клиент