我编写了ASP.NET框架MVC和Web API 2程序
我要去休息一下了解一些情况。此服务的安全性要求的性质要求我从一组有限的已知IP地址请求。我的客户机需求的性质是有一个未知数量的IP,由一些DHCP分配。我认为我需要站起来代理,将请求转发到服务,并将响应返回到请求的客户机。这个服务器可以分配一个静态IP,我可以向目标服务注册。我不想尝试复制目标服务的签名,每当他们决定改进接口时,我就必须维护我的代理。
我将拥有限制IP并接受GeT的服务
http://S/action
举个例子。我的代理人在
http://P/action
. 客户会发送GET
http://p/行动
作为回应,P会发送GET
http://s/操作
,收集响应,将其返回给客户机。
为了实现这个策略,我为P构建了一个不起作用的处理程序:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
DelegatingHandler handler = new DelegatingHandlerProxy<ProxyHandler>();
config.MessageHandlers.Add(handler);
}
}
委托代理是一种让依赖项注入容器参与的方法:
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;
}
}
我要做的代理程序是:
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容器提供一个预处理器,用于将请求的主机、端口和前缀更改为目标服务。转发器使用httpclient向目标发送请求。后处理器将是一个noop。
我没有建立任何控制器。我的想法是,如果这个管道按照我的预期运行,就不会有任何需要调用的控制器。当我发送Ant请求时,
http://P/anything
返回404,而不是htto://s/anything。我错过了什么?