为什么我的C#AJAX请求使用HTTP并且使用HTTPS失败?

时间:2014-12-15 10:04:41

标签: c# django nginx dotnet-httpclient django-allauth

我有一个使用django-allauth的django应用程序。

我还在生产环境中使用HTTPS部署了它。

来自Web浏览器的AJAX查询指向HTTPS站点,使用POST登录到'/ accounts / login /'按预期返回JSON。

问题在于我的C#移动代码(基于Xamarin)。

_client = new HttpClient(handler) {BaseAddress = uri};
_client.DefaultRequestHeaders.Add("X_REQUESTED_WITH", "XMLHttpRequest");

当用作BaseAddress的'uri'是http并指向我的开发服务器时,一切正常,我在响应中得到了JSON。

然而,当uri指向我的https网站(坐在nginx和gunicorn后面)时,我得到了一个HTML回复。

不知道为什么会这样。有人有任何想法吗?

1 个答案:

答案 0 :(得分:5)

好的,终于找到了答案。男孩是个好人。

https://serverfault.com/questions/508524/preserve-http-headers-from-django-using-nginx-and-gunicorn向我指出了有趣的nginx设置。

underscores_in_headers on;

默认情况下,nginx会阻止其中包含下划线的所有标头,如下所述:http://wiki.nginx.org/Pitfalls

这让我感到疑惑"为什么来自网络浏览器的请求工作但不是我的C#客户端?",答案很微妙。

在Chromium开发者网络标签中,我注意到浏览器发送的标题是" X-Requested-With"。这是由nginx(我认为)映射到" HTTP_X_REQUESTED_WITH"在proxy_pass部分,这正是django正在寻找的。

我在C#代码中进行了一次更改以使其正常工作。我改变了:

_client.DefaultRequestHeaders.Add("X_REQUESTED_WITH", "XMLHttpRequest");

_client.DefaultRequestHeaders.Add("X-REQUESTED-WITH", "XMLHttpRequest");

它开始工作了。

我希望这对未来有这个问题的人保持不变。