Die minimale YARP-API MapForwarder gibt immer 502 zurückC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Die minimale YARP-API MapForwarder gibt immer 502 zurück

Post by Anonymous »

Ich habe das folgende Problem in meiner Blazor (.Net 8) App. Ich versuche, den YARP Map Forwarder (Microsoft.Extensions.ServiceDiscovery.Yarp 8.0.2) zu verwenden, um Anforderungen, die den Blazor-Server vom Blazor-Client erreichen, als eine Art Reverse-Proxy an einen Back-End-Dienst weiterzuleiten. Es wird immer 502 Bad Gateway zurückgegeben. Was fehlt mir hier?

Code: Select all

...
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();
Ich habe versucht, dem MapForwarder eine neue ForwarderRequestConfig { Version = Version.Parse("1.1") hinzuzufügen, was keinen Erfolg brachte.
Ich habe auch versucht, den ProxyReqeust über den transformContext zu manipulieren und die Route direkt festzulegen oder Header-Manipulationen durchzuführen, aber nichts hat funktioniert.
Allerdings benutzerdefinierte Handhabung über app.Map funktioniert einwandfrei.

Code: Select all

// 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();

Code: Select all

// 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);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post