所有流量的 WebAPI 自定义路由



我一直在寻找这个问题的答案,但没有任何运气,所以也许这里有人有更多的见解:

1(我有一个进行http调用的应用程序。(方框1(

2(我有访问数据库的服务等等。(方框2(

3( 我正在研究将位于另一个位置的服务,其主要目的是从框 1 捕获所有服务请求,并从框 2 重新制作服务调用,然后将结果返回到框 1。(住在盒子3上的中间人(。

框 1 对框 3 进行 http 调用,框3 调用框 2,框 3 然后将结果返回到框 1。

我有代码设置来拦截使用ExecuteAsync的请求。我遇到的问题是,在应用程序服务(框 3(中 - 我无法在不存根框 2 上存在的请求函数/路由的情况下拦截调用(如果我不这样做,则返回 404,因为路由尚不存在框 3(。

我的终极问题是:是否可以允许所有请求通过 Web 服务并命中ExecuteAsync函数而不定义路由/函数?

我已经尝试了 RouteConfig 中RegisterRoutes函数的多种变体,但似乎没有任何效果。

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "*",
defaults: new { controller = "BaseController", action = "Index", id = UrlParameter.Optional }
);
}

好的,我想通了。

我实际上只需要存根 1 个 http 请求,如下所示:

[Route("api/{*url}")]
[HttpGet]
public IHttpActionResult Get() {
return BadRequest();
}

除非 ExecuteAsync 函数失败,否则此函数实际上永远不会被命中。ExecuteAsync 位于同一个控制器中,如下所示:

public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
if (Properties.Settings.Default.Redirect)
{
var url = controllerContext.Request.RequestUri;
url = new Uri(url.AbsoluteUri.Replace(
Properties.Settings.Default.OriginalUriFragment,
Properties.Settings.Default.ReplacemenUriFragment));
var client = new HttpClient();
client.DefaultRequestHeaders.Clear();
foreach (var httpRequestHeader in controllerContext.Request.Headers)
{
client.DefaultRequestHeaders.Add(httpRequestHeader.Key, httpRequestHeader.Value);
}
if (controllerContext.Request.Method == HttpMethod.Get)
{
return client.GetAsync(url, cancellationToken);
}
if (controllerContext.Request.Method == HttpMethod.Post)
{
return client.PostAsync(url, controllerContext.Request.Content, cancellationToken);
}
if (controllerContext.Request.Method == HttpMethod.Delete)
{
return client.DeleteAsync(url, cancellationToken);
}
if (controllerContext.Request.Method == HttpMethod.Put)
{
return client.PutAsync(url, controllerContext.Request.Content, cancellationToken);
}
}
return base.ExecuteAsync(controllerContext, cancellationToken);
}

最新更新