【问题标题】:WebApi custom route for all traffic所有流量的 WebApi 自定义路由
【发布时间】:2019-02-04 07:17:21
【问题描述】:

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

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 函数而无需定义路由/函数?

我尝试了 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 }
    );
}

【问题讨论】:

    标签: c# asp.net-web-api routing routeconfig


    【解决方案1】:

    好的,我想通了。

    我实际上只需要存根 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      相关资源
      最近更新 更多