2016-05-18 3 views
2

У меня есть прокси-контроллер, чтобы перенаправить запросы Ajax и передать те же файлы cookie из текущего домена в конечную точку веб-API, но он не работает так, как я ожидал. например куки в «https://www.example.com», URL веб-API «https://api.example.com/xyz/abc/». То, что я пытаюсь сделать, это отправив запрос Ajax дляПрокси-сервер Web API2 не перенаправляет запросы

«https://www.example.com/api/proxy/something»

и надеясь, что он будет перенаправлен на

«https://api.example.com/xyz/abc/something» с теми же настройками (особенно печенье).

Вот контроллер API на веб-сайте:

public class ProxyController : ApiController 
{ 
    private string _baseUri = "https://api.example.com/xyz/abc/"; 

    [AcceptVerbs(Http.Get, Http.Head, Http.MkCol, Http.Post, Http.Put)] 
    public async Task<HttpResponseMessage> Proxy() 
    { 
     using (HttpClient http = new HttpClient()) 
     { 
      string proxyURL = this.Request.RequestUri.AbsolutePath; 
      int indexOfProxy = proxyURL.IndexOf("proxy/") + 6; 
      _baseUri = _baseUri + proxyURL.Substring(indexOfProxy, proxyURL.Length - indexOfProxy); 
      this.Request.RequestUri = new Uri(_baseUri); 

      //For some reason Ajax request sets Content in the Get requests, because 
      //of that it was denied complaining about "cannot send a content-body" 
      if (this.Request.Method == HttpMethod.Get) 
      { 
       this.Request.Content = null; 
      } 

      return await http.SendAsync(this.Request); 
     } 
    } 
} 

Это не перенаправляет запросы. В ответе запрошенный URL-адрес совпадает с исходным запросом. Хост в заголовке запроса является «www.example.com» вместо «api.example.com», я обманываю эту проблему за последние несколько дней.

ответ

0

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

[AcceptVerbs(Http.Get, Http.Head, Http.MkCol, Http.Post, Http.Put)] 
public async Task<HttpResponseMessage> Proxy() 
{ 
    var request = this.Request; 

    var proxyUri = this.GetProxyUri(request.RequestUri); 

    request.RequestUri = proxyUri; 
    request.Headers.Host = proxyUri.Host; 
    if (request.Method == HttpMethod.Get) 
    { 
     request.Content = null; 
    } 

    //todo: Clone all cookies with the domain set to the domain of the proxyUri. Remove the old cookies and add the clones. 

    using (var client = new HttpClient()) 
    { 
     //default is 60 seconds or so 
     client.Timeout = TimeSpan.FromMinutes(5); 

     return await client.SendAsync(request, HttpCompletionOption.ResponseContentRead); 
    }  
} 

private string _baseUri = "https://api.example.com/xyz/abc/"; 

private Uri GetProxyUri(Uri originalUri) 
{ 
    var proxyUri = originalUri.AbsolutePath; 
    var indexOfProxy = proxyUri.IndexOf("proxy/") + 6; 
    var finalUri = _baseUri + proxyUri.Substring(indexOfProxy, proxyUri.Length - indexOfProxy); 
    return new Uri(finalUri); 
} 

Возможно, вы не сможете получить файлы cookie для правильной работы из-за переключения домена. Ваш клиент и сервер будут ограничены его доменом. Если у вас есть назначение прокси-сервера, вы можете изменить его, чтобы разрешить другие механизмы, кроме файлов cookie. Можете ли вы использовать заголовки, или запрос, и т. Д.? Домен просто может быть убийцей.

+0

Просто подумайте больше о куках и доменах. В вашем примере домен верхнего уровня одинаков, только разные поддомены. Если это так, просто убедитесь, что cookie setter использует междоменные куки. Таким образом, файлы cookie будут автоматически передаваться. Если вы находитесь в разных доменах полностью, я не думаю, что файлы cookie будут работать на вас. – ManOVision

+0

Спасибо ManOVision! Да, cookie настроен для «example.com», и он должен работать. –

+0

Это работает, поскольку оно перенаправляется на api.example.com, но файл cookie для «example.com» не передается автоматически, мне все еще нужно его явно указать? –

0

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

Но до тех пор, вы можете попробовать использовать RestSharp, это фиксированная моя проблема.

Я думаю, что это проблема с базовым свойством HttpClient, он каким-то образом инициализируется исходным адресом и делает запрос на этот адрес вместо прокси-сервера.

Я исследую и дам вам знать.

+0

Похоже, мы на одной лодке :), на самом деле я думал о RestSharp, но я не пробовал это для этого. Я буду использовать RestSharp, надеюсь, он будет работать, чтобы исправить это, все еще любопытно, почему HttpClient не работает. Спасибо –

Смежные вопросы