我有一個asp.net mvc網站部署在服務器上,爲他人提供一些網絡接口。例如,獲取當前用戶的信息,我的測試C#控制檯應用程序是這樣的:400錯誤的請求無效的主機名只在android應用
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時,授權頭設置爲編碼令牌。其實它在我的機器上工作正常。但是,有一個人在一個Android應用程序訪問此網址時遇到別的一個奇怪的問題,這裏是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)所有的個人電腦/手機可以訪問測試索引頁(http://api.fake.mysite.com)
(4)平API。 fake.mysite.com工作正常
(5)如果去除httpGet.addHeader("Authorization", encoded);
,Java程序有一個401未授權的結果如預期(我的控制下的服務器代碼返回結果)
(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應用程序具有網絡權限(其實我們已經添加的所有權限)
有誰知道原因或者幫忙找原因?非常感謝,這個問題讓我瘋狂。
什麼是服務器日誌告訴你住址? – Orlymee
@Olylye:在列表中查看我的編輯:項目(8)。 –
檢查你的'AndroidManifest',你有'<使用權限android:name =「android.permission.INTERNET」/>' –