Запрос Asp.net Web Api Redirect

У меня есть проект веб-API Asp.net, который имеет несколько методов CRUD.

В дополнение к этим методам, я хочу добавить службу авторизации, которая читает заголовок Authorization и запрещает пользователям доступ к ресурсам (если они не авторизованы).

// Method on internal IP Project
public class InternalController : ApiController
{
    public void Create(CreateRequest request)
    {
        // implement the method
    }
}

// Method on public IP Project
public class ExternalController : ApiController
{
    public async Task Create(CreateRequest request)
    {
        // validate Authorization header and throw exception if not valid

        using (HttpClient client = new HttpClient())
        {
            string parameters = string.Format("param1={0}&param2={1}", request.Param1, request.Param2);

            client.BaseAddress = new Uri("http://192.168.1.1/");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = await client.GetAsync("api/internal/create?" + parameters);
            response.EnsureSuccessStatusCode();
        }
    }
}

Есть ли способ "перенаправлять" запрос от внешнего API во внутренний API более легко?

В настоящий момент мне нужно вручную заново создать все параметры, которые я получаю в ExternalAPI, и отправить их в InternalAPI, даже если они совпадают.

Могу ли я сделать HttpClient автоматически отправить объект HttpRequestMessage (Request), который у меня есть в методе ExternalAPI?

Ответ 1

Говоря об ASP.NET Web API. HttpClient автоматически не перенаправит вас. Когда вы получите ответ от внутренней службы, вы можете передать ее внешнему. Или вы можете перенаправить свое действие, например здесь

Чтобы сделать его правильное перенаправление для клиента с точки зрения REST, используйте заголовки перенаправления HTTP и коды повторений. Например HTTP-код ответа 302. И тогда клиент должен иметь возможность реагировать на такой код ответа и получать адрес перенаправления из заголовка Location. Но это касается перенаправления для клиента.

Говоря о вызове некоторых внутренних сервисов из вашего API из архитектуры. У вас есть следующие варианты:

  • Вызов внутренней службы как метод класса
  • Сделать сервис для обслуживания
  • Настройка очереди сообщений или шины, и ваш API будет связываться с ней через служебную шину.

Вызов внутренней службы как метод класса Очень просто. Отсутствие влияния и задержки для вызова службы. Но вы должны ссылаться на сборку, и это не всегда возможно. Или такой способ невозможен из-за требований

Сделать услугу для вызова службы Имеет недостатки: ваши услуги тесно связаны, у вас есть задержка и вы должны ждать ответа от внутренней службы. Он считался плохой практикой. Но может быть хорошим временным решением в качестве первого шага для обслуживания шины.

Настройка очереди сообщений или шины, и ваш API будет связываться с ней через служебную шину. Ваши услуги отделены и независимы. Вы не должны ждать ответа. Но технически сложнее настроить и сделать вашу архитектуру и инфраструктуру более сложными /

Как резюме Для вашей архитектуры нет лучшего способа, и вы должны выбрать из альтернатив в соответствии с вашими требованиями.

Ответ 2

Вот пример кода для отправки данных в web api: -

    var handler = new HttpClientHandler {UseDefaultCredentials = true};
        using (var client = new HttpClient(handler))
        {   
            client.BaseAddress = new Uri("https://IE url.com");  
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var  postDataObject = new
                {
                    SCName = properties.Site.PortalName,
                    TotalSites = properties.Web.Webs.Count
     };

    var jsonPostData = new JavaScriptSerializer().Serialize(postDataObject);
                HttpContent content = new StringContent(jsonPostData, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = client.PostAsync("/controllerclassname/InsertUpdateDataOperation", content).Result;
                if (response.IsSuccessStatusCode)
                {
        //Check the response here
                  //  var webApiResponse = response.Content.ReadAsStringAsync().Result;                    
                }