2013-04-30 3 views
2

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

В дополнение к этим методам, я хочу добавить службу авторизации, которая считывает заголовок 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?

+0

ли ExternalController' на том же веб-проект 'InternalController' и'? – haim770

+0

Нет, это разные проекты – Catalin

ответ

4

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

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

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

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

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

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

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

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

+0

Очень полный ответ! Я думаю, что я буду использовать класс Service, также потому, что я могу ссылаться на сборки, которые мне нужны. – Catalin

0

Вот пример кода, чтобы отправить данные в 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;      
       }