Минимальный API YARP MapForwarder всегда возвращает 502C#

Место общения программистов C#
Ответить
Anonymous
 Минимальный API YARP MapForwarder всегда возвращает 502

Сообщение Anonymous »

У меня возникла следующая проблема в приложении Blazor (.Net 8). Я пытаюсь использовать перенаправление карт YARP (Microsoft.Extensions.ServiceDiscovery.Yarp 8.0.2) для пересылки запросов, которые достигают сервера Blazor от клиента Blazor, во внутреннюю службу в качестве своего рода обратного прокси-сервера. Он всегда возвращает 502 Bad Gateway. Что мне здесь не хватает?
...
app.UseRouting();
app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntiforgery();
app.UseAuthorization();

app.MapRazorComponents()
.AddInteractiveServerRenderMode()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(BlazorProject.Client._Imports).Assembly);

// Always returns 502. As far as i can tell it forwards the request to itself instead of localhost:5000, but i may be wrong here
app.MapForwarder("/weather-forecast", "http://localhost:5000", transformBuilder =>
{
transformBuilder.AddRequestTransform(async transformContext =>
{
var accessToken = await transformContext.HttpContext.GetTokenAsync("access_token");
transformContext.ProxyRequest.Headers.Authorization = new("Bearer", accessToken);
});
}).RequireAuthorization();

Я пытался добавить новый ForwarderRequestConfig { Version = Version.Parse("1.1") в MapForwarder, но это не принесло успеха.
Я также пытался манипулировать ProxyReqeust через TransformContext и напрямую устанавливать маршрут или выполнять манипуляции с заголовком, но ничего не помогло.
Однако пользовательская обработка через app.Map работает нормально.
// Custom example
var httpClient = new HttpMessageInvoker(new SocketsHttpHandler
{
UseProxy = false,
AllowAutoRedirect = false,
AutomaticDecompression = DecompressionMethods.None,
UseCookies = false,
EnableMultipleHttp2Connections = true,
ActivityHeadersPropagator = new ReverseProxyPropagator(DistributedContextPropagator.Current),
ConnectTimeout = TimeSpan.FromSeconds(15),
});

// Setup our own request transform class
var transformer = new CustomHttpTransformer();
var requestConfig = new ForwarderRequestConfig { ActivityTimeout = TimeSpan.FromSeconds(10)};

app.Map("/weather-forecast", async (HttpContext httpContext, IHttpForwarder forwarder) =>
{
var error = await forwarder.SendAsync(httpContext, "http://localhost:5000",
httpClient, requestConfig, transformer);
// Check if the operation was successful
if (error != ForwarderError.None)
{
var errorFeature = httpContext.GetForwarderErrorFeature();
throw errorFeature?.Exception ?? new Exception($"ForwarderError: {error}. Getting standard exception failed");
}
}).RequireAuthorization();

// Content of CustomHttpTransformer
public override async ValueTask TransformRequestAsync(HttpContext httpContext,
HttpRequestMessage proxyRequest, string destinationPrefix, CancellationToken cancellationToken)
{
// Copy all request headers
await base.TransformRequestAsync(httpContext, proxyRequest, destinationPrefix, cancellationToken);

// Customize the query string:
var queryContext = new QueryTransformContext(httpContext.Request);

// Set custom uri
proxyRequest.RequestUri = RequestUtilities.MakeDestinationAddress($"{destinationPrefix}", httpContext.Request.Path, queryContext.QueryString);

// Suppress the original request header, use the one from the destination Uri.
proxyRequest.Headers.Host = null;

// Set authorization Headers
var accessToken = await httpContext.GetTokenAsync("access_token");
proxyRequest.Headers.Authorization = new("Bearer", accessToken);
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... eturns-502
Ответить

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

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

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

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

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