2

我在服务器上部署了一个 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权限(实际上我们已经添加了所有权限)

有谁知道原因或帮助找到原因?非常感谢,这个问题快把我逼疯了。

4

2 回答 2

0

应该httpGet.addHeader("Authorization", "basic " + encoded);String encoded = Base64.encodeToString(token.getBytes(), Base64.NO_WRAP);

于 2013-07-18T15:48:51.483 回答
0

我也遇到了同样的问题。我可以在调试模式下从 Fiddler 或任何其他工具向我的 asp.net Web API 发送 HTTP POST,但我无法从我的 android 应用程序访问。

  1. 我试图确保从我的计算机浏览器连接到 Web API 接口。

  2. 我试图确保从安卓模拟器网络
    浏览器(AEWB)进行连接。然后我将我的 web api 部署到 IIS,这样我就可以从 AEWB 获取某些地址来访问。

我可以从我的 AEWB 访问这个地址

http://10.0.0.2:8088/api/tran

http://10.0.0.2 -> this is your local host address seen from Android
8088  -> this is your port of web api hosted on IIS
/api  -> this is web api
/tran -> this is your controller

我可以使用 AEWB 从我的 IIS 地址获取 json 值

于 2016-01-13T00:27:50.413 回答