Я пытаюсь создать SelfHost WebApi 2.0 (не .net Core) для целей обратного прокси.API не имеет никакого контроллера, вместо этого я создал DelegatingHandler
, который будет прокси-запрос на другое место.
Вот обработчик прокси
class ProxyHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return await RedirectRequest(request, cancellationToken).ConfigureAwait(false);
}
private async Task<HttpResponseMessage> RedirectRequest(HttpRequestMessage request, CancellationToken cancellationToken)
{
var redirectLocation = "http://localhost:8099";
using (var client = new HttpClient())
{
using (var cloned = await CloneHttpRequestMessageAsync(request).ConfigureAwait(false))
{
cloned.RequestUri = new Uri($"{redirectLocation}{request.RequestUri.PathAndQuery}");
return await client.SendAsync(cloned, cancellationToken).ConfigureAwait(false);
}
}
}
private async Task<HttpRequestMessage> CloneHttpRequestMessageAsync(HttpRequestMessage request)
{
var clone = new HttpRequestMessage(request.Method, request.RequestUri);
if (request.Content != null)
{
var stream = new MemoryStream();
await request.Content.CopyToAsync(stream).ConfigureAwait(false);
stream.Position = 0;
if ((stream.Length > 0 || request.Content.Headers.Any()) && clone.Method != HttpMethod.Get)
{
clone.Content = new StreamContent(stream);
if (request.Content.Headers != null)
foreach (var h in request.Content.Headers)
clone.Content.Headers.Add(h.Key, h.Value);
}
}
clone.Version = request.Version;
foreach (var prop in request.Properties)
clone.Properties.Add(prop);
foreach (var header in request.Headers)
clone.Headers.TryAddWithoutValidation(header.Key, header.Value);
return clone;
}
}
Однако яНе удалось создать маршрут «перехватить все» в конфигурации, я попытался: config.MessageHandlers.Add(new ProxyHandler());
или
var handler = HttpClientFactory.CreatePipeline(new HttpClientHandler(), new[] { new ProxyHandler() });
config.Routes.MapHttpRoute("default", "{*path}", null, null, handler);
Вызывается ProxyHandler
, однако клиент получает 404 http error: noдля этого запроса были найдены данные маршрута .
Как создать конфигурацию, для которой не требуется контроллер, а все запросы отправляются на ProxyHandler
?