Пользовательский маршрут WebApi для всего трафика - PullRequest
0 голосов
/ 29 августа 2018

Я безуспешно искал ответ на этот вопрос, поэтому, возможно, у кого-то здесь есть немного больше понимания:

1) У меня есть приложение, которое выполняет http-вызовы. (На коробке 1)

2) У меня есть сервисы, которые обращаются к базе данных и так далее. (На коробке 2)

3) Я работаю со службами, которые будут жить в другом месте, и его основная цель - перехватить все запросы на обслуживание из коробки 1 и заново обработать вызов службы из коробки 2, а затем вернуть результат в коробку 1. (Средний человек который живет на коробке 3).

Блок 1 выполняет http-вызовы для блока 3, который выполняет вызовы для блока 2, блок 3 затем возвращает результат в блок 1. 1.

У меня есть настройки кода для перехвата запросов, используя ExecuteAsync. Проблема, с которой я сталкиваюсь, в appservice (блок 3) - я не могу перехватить вызовы, не заглушая функции / маршруты запросов, которые существуют в блоке 2 (404 возвращается, если я этого не делаю, поскольку маршрут отсутствует). на коробке 3 пока нет).

Мой последний вопрос: можно ли разрешить всем запросам проходить через веб-сервис и выполнять функцию 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 }
    );
}

1 Ответ

0 голосов
/ 29 августа 2018

Хорошо, я понял это.

Мне на самом деле нужно было только заглушить 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...