代理web服务到web服务-我在哪里失踪



我编程ASP。NET框架MVC和Web API 2

我必须访问REST服务以获取一些信息。此服务的安全要求的性质要求我从一组有限的已知IP地址中询问。我的客户端需求的性质是,将有未知数量的客户端具有由某些DHCP分配的IP。我想我需要建立一个代理,它将向服务转发请求,并向提出请求的客户返回响应。这个服务器可以被分配一个静态IP,我可以向目标服务注册。我不想试图复制目标服务的签名,每当他们决定改进接口时,我就必须维护我的代理。

我将拥有限制IP并接受GET的服务http://S/action作为一个例子。我会在http://P/action.客户端将发送GEThttp://P/action作为响应,P将发送GEThttp://S/action,收集响应,并将其返回给客户端。

为了实现这个策略,我为p构建了一个不起作用的处理程序:

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
DelegatingHandler handler = new DelegatingHandlerProxy<ProxyHandler>();
config.MessageHandlers.Add(handler);
}
}

DelegatingProxyHandler是一种让我的依赖注入容器参与进来的方法:

public sealed class DelegatingHandlerProxy<THandler> : DelegatingHandler
where THandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
IDependencyScope scope = request.GetDependencyScope();
Task<HttpResponseMessage> task;
if (scope.GetService(typeof(THandler)) is DelegatingHandler handler)
{
if (!ReferenceEquals(handler.InnerHandler, InnerHandler))
{
handler.InnerHandler = InnerHandler;
}
HttpMessageInvoker invoker = new HttpMessageInvoker(handler);
task = invoker.SendAsync(request, cancellationToken);
}
else
{
throw new InvalidOperationException("Handler not registered with DI container");
}
return task;
}
}

我想做这项工作的ProxyHandler是:

public class ProxyHandler: DelegatingHandler
{
public ProxyHandler(
ITransformRequest preProcessor,
ITransformResponse postProcessor,
IForwardRequest forwarder)
{
PreProcessor = preProcessor;
PostProcessor = postProcessor;
Forwarder = forwarder;
}
private ITransformRequest PreProcessor { get; }
private ITransformResponse PostProcessor { get; }
private IForwardRequest Forwarder { get; }
#region Overrides of DelegatingHandler
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}
if (PreProcessor != null)
{
request.RequestUri = PreProcessor.Transform(request.RequestUri);
}
HttpResponseMessage response = await Forwarder.Forward(request, cancellationToken);
HttpResponseMessage transformedResponse = PostProcessor.Transform(response);
return transformedResponse;
}
#endregion
}

在这种情况下,DI容器会提供一个PreProcessor,它会将请求的主机、端口和前缀更改为目标服务。转发器使用HttpClient将请求发送到目标。PostProcessor将是一个noop。

我没有制造任何控制器。我的想法是,如果这个管道的行为符合我的预期,就不会有任何控制器需要调用。当我向它发送蚂蚁请求时,http://P/anything返回404,而不是htto://S/anything.我错过了什么?

任何特定的原因,您不只是编写一组匹配的控制器来接受客户端请求,然后使用实现简单web客户端的服务在第三方API上执行等效请求,然后返回响应-可能包括一些身份验证&缓存逻辑以降低对其API的影响?

如果您的第三方API提供商限制IP请求,这可能是因为他们信任(或明确要求(您管理对其API的请求,以保护其免受过度负载和/或安全风险的影响。在中间件中没有任何逻辑的情况下直接转发所有客户端请求意味着您否定了这一限制。

如果您的应用程序的目的是提供静态IP(并且您不需要在代码中添加任何逻辑(,那么您应该考虑使用许多现成的API网关产品之一,例如Kong,这是一个开放源代码,非常成熟,有大量的社区支持https://konghq.com/kong-community-edition/

最新更新