2

サーバーに asp.net mvc Web サイトをデプロイして、他の Web インターフェイスにいくつかの 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) Web サイトのドメイン名がサーバー 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 アプリケーションのみが使用できません (2 つのまったく異なる Android 携帯電話でテストされ、Android エミュレーターも 400 の無効なホスト名を取得しました)。

(7) ドメイン名http://xx.xx.xx.xx/v1.0/user/currentの代わりに IP を使用します。すべて同じです。(xx.xx.xx.xx は IP アドレスを表します)

(8) IIS ログを確認すると、/v1.0/user/current へのすべての要求が 200/401/500 を返し、400 の結果はありません。

(9) Android アプリケーションにインターネット アクセス許可があることを確認します (実際には、すべてのアクセス許可を追加しました)。

誰かが理由を知っているか、理由を見つけるのを手伝ってくれますか? どうもありがとう、この問題は私を夢中にさせています。

4

2 に答える 2

0

私はまったく同じ問題に苦労しました。Fiddler またはその他のツールから HTTP POST をデバッグ モードで asp.net Web API に送信できますが、Android アプリケーションからはアクセスできません。

  1. コンピューターのブラウザーから Web 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

AEWB を使用して IIS アドレスから json 値を取得できます

于 2016-01-13T00:27:50.413 に答える
0

あるべきでhttpGet.addHeader("Authorization", "basic " + encoded);あり、String encoded = Base64.encodeToString(token.getBytes(), Base64.NO_WRAP);

于 2013-07-18T15:48:51.483 に答える