2012-09-14 39 views
2

我有一個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應用程序具有網絡權限(其實我們已經添加的所有權限)

有誰知道原因或者幫忙找原因?非常感謝,這個問題讓我瘋狂。

+0

什麼是服務器日誌告訴你住址? – Orlymee

+0

@Olylye:在列表中查看我的編輯:項目(8)。 –

+0

檢查你的'AndroidManifest',你有'<使用權限android:name =「android.permission.INTERNET」/>' –

回答

0

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

0

我掙扎了同樣的問題。我可以將Fiddler或任何其他工具的HTTP POST以調試模式發送到我的asp.net web API,但我無法從我的android應用程序訪問。

  1. 我想請務必從我的電腦瀏覽器連接到網絡 API接口。

  2. 我試圖確定從android模擬器web
    瀏覽器(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 

I can get json values from my IIS adres with AEWB

+0

我已經離開那家公司了。但我記得最後我們還沒有解決這個問題。 Android開發者使用另一種解決方案來避免這種情況,但我不知道如何。順便說一句,你不應該發佈「我有同樣的問題」作爲答案。 –

相關問題