【发布时间】:2012-09-07 06:55:00
【问题描述】:
我在服务器上部署了一个 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) 确保安卓应用有互联网权限(实际上我们已经添加了所有权限)
有没有人知道原因或帮助找到原因?非常感谢,这个问题快把我逼疯了。
【问题讨论】:
-
服务器日志告诉你什么?
-
@Orlymee:查看我的编辑:列表中的第 (8) 项。
-
检查你的
AndroidManifest,你有<uses-permission android:name="android.permission.INTERNET"/> -
在这种情况下,我使用 WireShark 工具 (wireshark.org) 进行调试。如果您有权访问服务器,请尝试嗅探传输的包。或者,如果服务器不可用,则在独立 PC 上的模拟器中运行您的 android 应用并嗅探请求。
-
@TheDimasig:感谢您的回复。我们已添加所有权限。我们还捕获在模拟器中发送的数据。但这真的很难理解。
标签: c# java android asp.net-mvc