为什么我的C#AJAX请求与HTTP一起工作,并且HTTPS失败?

我有一个django应用程序与Django-Allauth合作。

我也在生产环境中使用HTTPS进行部署。

指向HTTPS站点的Web浏览器使用POSTlogin到“/ accounts / login /”的AJAX查询返回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回应。

不知道为什么发生这种情况。 任何人有任何想法?

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

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

这让我想知道“为什么从Web浏览器的请求工作,但不是我的C#客户?”,答案是微妙的。

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

我在C#代码中做了一个改变,以使其工作。 我变了:

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

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

它开始工作。

我希望这个问题留待将来的人解决。