Web 服务的代理 Web 服务 - 我在哪里遗漏了?
A proxy web service to a web service - where am I missing?
我编程 ASP.NET Framework MVC 和 Web API 2
我必须访问 REST 服务才能获取一些信息。此服务的安全要求的性质要求我从一组有限的已知 IP 地址请求。我的客户要求的本质是,会有未知数量的 IP 由某些 DHCP 分配。我想我需要建立一个代理,它将请求转发给服务,并将 return 响应转发给请求的客户端。可以为该服务器分配一个静态 IP,我可以向目标服务注册该 IP。我不想尝试复制目标服务的签名,并且在他们决定改进接口时必须维护我的代理。
我将拥有限制 IP 并接受 http://S/action as an example. I would have the proxy at http://P/action. The client would send GET http://P/action and P would, in response, send GET http://S/action 的 GET 的服务,收集响应,return 将其返回给客户端。
尝试实施此策略,这是我为 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,用于更改对目标服务的请求的主机、端口和前缀。 Forwarder 使用 HttpClient 将请求发送到目标。后处理器将是一个 noop。
我没有构建任何控制器。我的想法是,如果此管道的行为符合我的预期,则不会有任何控制器需要调用。当我向此发送 ant 请求时,http://P/anything return 是 404,而不是 htto://S/anything。我错过了什么?
任何特殊原因,您不只是编写一组匹配的控制器来接受客户端请求,然后使用实现简单 Web 客户端然后返回的服务在 3rd arty API 上执行等效请求响应 - 可能包括一些身份验证和缓存逻辑以降低对他们的影响 API?
如果您的第 3 方 API 提供商通过 IP 限制请求,这可能是因为他们信任(或明确要求)您管理对他们 API 的请求,以保护它免受过度负载 and/or 安全风险。在你的中间件中不带任何逻辑地直接转发所有客户端请求意味着你否定了这个限制。
如果您的应用程序的仅目的是提供静态 IP(并且您不需要在代码中添加任何逻辑),那么您应该考虑使用以下方法之一许多现成的 API 网关产品 - 例如Kong,它是一个开放源代码并且非常完善,拥有大量社区支持 https://konghq.com/kong-community-edition/
我编程 ASP.NET Framework MVC 和 Web API 2
我必须访问 REST 服务才能获取一些信息。此服务的安全要求的性质要求我从一组有限的已知 IP 地址请求。我的客户要求的本质是,会有未知数量的 IP 由某些 DHCP 分配。我想我需要建立一个代理,它将请求转发给服务,并将 return 响应转发给请求的客户端。可以为该服务器分配一个静态 IP,我可以向目标服务注册该 IP。我不想尝试复制目标服务的签名,并且在他们决定改进接口时必须维护我的代理。
我将拥有限制 IP 并接受 http://S/action as an example. I would have the proxy at http://P/action. The client would send GET http://P/action and P would, in response, send GET http://S/action 的 GET 的服务,收集响应,return 将其返回给客户端。
尝试实施此策略,这是我为 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,用于更改对目标服务的请求的主机、端口和前缀。 Forwarder 使用 HttpClient 将请求发送到目标。后处理器将是一个 noop。
我没有构建任何控制器。我的想法是,如果此管道的行为符合我的预期,则不会有任何控制器需要调用。当我向此发送 ant 请求时,http://P/anything return 是 404,而不是 htto://S/anything。我错过了什么?
任何特殊原因,您不只是编写一组匹配的控制器来接受客户端请求,然后使用实现简单 Web 客户端然后返回的服务在 3rd arty API 上执行等效请求响应 - 可能包括一些身份验证和缓存逻辑以降低对他们的影响 API?
如果您的第 3 方 API 提供商通过 IP 限制请求,这可能是因为他们信任(或明确要求)您管理对他们 API 的请求,以保护它免受过度负载 and/or 安全风险。在你的中间件中不带任何逻辑地直接转发所有客户端请求意味着你否定了这个限制。
如果您的应用程序的仅目的是提供静态 IP(并且您不需要在代码中添加任何逻辑),那么您应该考虑使用以下方法之一许多现成的 API 网关产品 - 例如Kong,它是一个开放源代码并且非常完善,拥有大量社区支持 https://konghq.com/kong-community-edition/