我在服务器上部署了一个 asp.net mvc 网站,为其他人提供了一些 Web 界面。例如,获取当前用户的信息,我的测试 C# 控制台应用程序如下所示:
using (var client = new WebClient())
{
try
{
var url = "http://api.fake.mysite.com/v1.0/user/current";
var token = "e0034e1c082de62b74e361b15f9c6471";
var encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(token));
client.Headers["Authorization"] = encoded;
client.Headers["Content-Type"] = "application/json";
Console.WriteLine(client.DownloadString(url));
}
catch (WebException e)
{
//log the exception
}
}
可以看到用法非常简单,只需通过 HTTP_GET 请求 url,将Authorization标头设置为编码令牌。实际上它在我的机器上运行良好。但是其他人在 android 应用程序中访问这个 url 时遇到了一个奇怪的问题,这里是 java 代码:
HttpClient httpClient = new DefaultHttpClient();
String token = "e0034e1c082de62b74e361b15f9c6471";
String url = "http://api.fake.mysite.com/v1.0/user/current";
HttpGet httpGet = new HttpGet(url);
String encoded = Base64.encodeToString(token.getBytes(), Base64.DEFAULT);
httpGet.addHeader("Authorization", encoded);
httpGet.addHeader("Content-Type", "application/json");
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
int responseCode = httpResponse.getStatusLine().getStatusCode();
String response = EntityUtils.toString(httpResponse.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
然后他得到“400 bad request invalid host name”错误。我试过了:
(1) 确保变量“encoded”在 C# 和 Java 代码中具有相同的值。
(2) 确保在服务器 IIS 中正确设置网站的域名
(3)所有PC/手机均可访问测试索引页面(http://api.fake.mysite.com)
(4) ping api.fake.mysite.com 工作正常
(5)如果删除httpGet.addHeader("Authorization", encoded);
,Java程序按预期得到401 Unauthorized结果(我控制的服务器代码返回结果)
(6) 其他一些使用C#和PHP的应用程序可以很好地使用web方法,只有android应用程序不能(在两个完全不同的android手机上测试,android模拟器也有400个无效的主机名)
(7)用IP代替域名http://xx.xx.xx.xx/v1.0/user/current,一切都一样。(xx.xx.xx.xx代表ip地址)
(8)查看IIS日志,对/v1.0/user/current的所有请求都返回200/401/500,没有400的结果。
(9) 确保android应用程序有internet权限(实际上我们已经添加了所有权限)
有谁知道原因或帮助找到原因?非常感谢,这个问题快把我逼疯了。