0

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

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

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

3)我正在研究将生活在另一个位置的服务,其主要目的是捕获来自框 1 的所有服务请求并从框 2 重新进行服务调用,然后将结果返回到框 1。(一个中间人住在框 3)。

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

我有代码设置来拦截使用ExecuteAsync. 我遇到的问题是,在 appservice 中(框 3)- 如果不删除框 2 上存在的请求函数/路由,我无法拦截调用(如果我不这样做,则会返回 404,因为路由没有'在框 3 上尚不存在)。

我的最终问题是:是否有可能允许所有请求通过 web 服务并在ExecuteAsync没有定义路由/功能的情况下点击功能?

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

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 }
    );
}
4

1 回答 1

0

好吧,我想通了。

我实际上只需要存根 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);
    }
于 2018-08-29T13:55:58.860 回答