400错误请求无效主机名仅在Android应用程序中

时间:2012-09-14 06:01:21

标签: c# java android asp.net-mvc

我在服务器上部署了一个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请求网址,将授权标头设置为编码令牌。实际上它在我的机器上工作正常。但是在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错误请求无效主机名”错误。我试过了:

(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应用程序具有互联网权限(实际上我们已添加了所有权限)

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我在同样的问题上挣扎。我可以在调试模式下从Fiddler或任何其他工具向我的asp.net web API发送HTTP POST,但我无法从我的Android应用程序访问。

  1. 我试图确保从我的电脑浏览器连接到 web API接口。

  2. 我试图确保从android模拟器网络连接 浏览器(AEWB)。然后我将我的web api部署到IIS,这样我就可以获得从AEWB访问的特定地址。

  3. 我可以从我的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
    

    I can get json values from my IIS adres with AEWB