Web API2代理不会重定向请求

时间:2016-05-18 12:51:33

标签: c# ajax cookies asp.net-web-api proxy

我有一个代理控制器,以便重定向Ajax请求并将相同的cookie从当前域传递到Web API端点,但它不能像我预期的那样工作。例如“https://www.example.com”中的Cookie,Web API网址“https://api.example.com/xyz/abc/”。我想要做的是向

发送Ajax请求

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

并希望将其重定向到

https://api.example.com/xyz/abc/something”使用相同的设置(尤其是Cookie)。

以下是网站中的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”,过去几天我对这个问题感到疯狂。

2 个答案:

答案 0 :(得分:0)

两天前我遇到了这样的问题。 Haven没有弄明白究竟是什么造成了它,我今天要去调查并告诉你。

但在此之前,您可以尝试使用RestSharp,它解决了我的问题。

我认为这是HttpClient的BaseAddress属性的问题,它以某种方式用初始地址初始化并向该地址而不是代理地址发出请求。

我会调查并通知你。

答案 1 :(得分:0)

HttpClient可以正常工作。我们已经多次这样做了。但是,cookie很棘手,因为它们与域绑定在一起。以下是一些没有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之外的其他机制。你可以使用标题,查询字符串等吗?域名可能是一个杀手。