Пользовательский маршрут WebApi для всего трафика

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

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

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

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

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

У меня есть настройка кода для перехвата запросов с использованием ExecuteAsync. Проблема, с которой я сталкиваюсь, заключается в том, что в службе приложений (поле 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 }
    );
}

person Community    schedule 29.08.2018    source источник


Ответы (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);
    }
person Eddy Howard    schedule 29.08.2018