C# web服务的代理web服务-我缺少什么?

C# web服务的代理web服务-我缺少什么?,c#,asp.net-web-api2,C#,Asp.net Web Api2,我编写了ASP.NET框架MVC和Web API 2 我必须访问REST服务获取一些信息。此服务的安全要求的性质要求我从一组有限的已知IP地址进行请求。我的客户需求的本质是,将有一个未知数量的IP由一些DHCP分配。我认为我需要建立一个代理,将请求转发给服务,并将响应返回给提出请求的客户端。可以为该服务器分配一个静态IP,我可以向目标服务注册该IP。我不想尝试复制目标服务的签名,并且在他们决定改进接口时必须维护我的代理 我会有一个限制IP的服务,并以接受GET为例。我会让代理人在。客户机将发送G

我编写了ASP.NET框架MVC和Web API 2

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

我会有一个限制IP的服务,并以接受GET为例。我会让代理人在。客户机将发送GET,P将作为响应发送GET,收集响应,并将其返回给客户机

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

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        DelegatingHandler handler = new DelegatingHandlerProxy<ProxyHandler>();
        config.MessageHandlers.Add(handler);
    }
}
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
DelegatingHandler处理程序=新建DelegatingHandlerProxy();
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;
    }
}
公共密封类DelegatingHandler代理:DelegatingHandler
唐德勒在哪里:德莱格廷·汉德勒
{
受保护的覆盖任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌)
{
IDependencyScope scope=request.GetDependencyScope();
任务;
if(scope.GetService(typeof(THandler))是DelegatingHandler处理程序)
{
如果(!ReferenceEquals(handler.InnerHandler,InnerHandler))
{
handler.InnerHandler=InnerHandler;
}
HttpMessageInvoker=新的HttpMessageInvoker(处理程序);
task=invoker.sendaync(请求、取消令牌);
}
其他的
{
抛出新的InvalidOperationException(“未向DI容器注册的处理程序”);
}
返回任务;
}
}
我想做这项工作的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
}
public类代理处理程序:DelegatingHandler
{
公共代理处理器(
ITransformRequest预处理器,
ITransformResponse后处理器,
IForwardRequest(请求转发器)
{
预处理器=预处理器;
后处理器=后处理器;
货代=货代;
}
私有ITransformRequest预处理器{get;}
专用ITransformResponse后处理器{get;}
专用IForwardRequest转发器{get;}
#DelegatingHandler的区域覆盖
受保护的覆盖异步任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌)
{
if(请求==null)
{
抛出新ArgumentNullException(nameof(request));
}
if(预处理器!=null)
{
request.RequestUri=预处理器.Transform(request.RequestUri);
}
HttpResponseMessage response=等待转发器.Forward(请求,取消令牌);
HttpResponseMessageTransformedResponse=后处理器.Transform(响应);
返回转换响应;
}
#端区
}
在这种情况下,DI容器提供了一个预处理器,用于将请求的主机、端口和前缀更改为目标服务。转发器使用HttpClient向目标发送请求。后处理器将是一个noop


我没有建立任何控制器。我的想法是,如果这个管道的行为符合我的预期,那么就不会有任何需要调用的控制器。当我向这个发送ant请求时,返回404,而不是htto://S/anything. 我遗漏了什么?

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

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


如果您的应用程序的唯一目的是提供静态IP(并且您不需要在代码中添加任何逻辑),那么您应该考虑使用许多现成的API网关产品中的一种,例如这是一个开源的、有大量社区支持的、非常成熟的代理服务器,当有很多免费的、现成的选项可用时,您想编写代理服务器有什么特别的原因吗?您已经在问题中提到过:

webapi
(甚至
MVC
或裸体)。不需要其他“组件”来完成您想做的事情。它与实现任何其他第三方REST API没有什么不同,您希望为“您的”用户提供这些API,例如Paypal REST API编写代理是我的想法,因为我是一名程序员,我的第一个想法是编写一些东西。也许“实现代理”是一个更好的短语,所以它包括了“购买”选项和“构建”选项。第三方并没有明确要求我限制加载他们的服务。他们一定很信任我。需要这项服务的客户都是我公司的产品。这些客户中的每一位都将遵守我们为代码制定的安全策略,并且将成为我和第三方之间合同的一部分。外部代理不会向服务器发送任意请求。我不是想成为一个