1

奇妙な問題があります。私の Android アプリから、ASP.NET Web API を呼び出しています。アプリから問題なく POST リクエストを行うことができます。ただし、GET リクエストを行うと、リクエストは「400 bad request invalid hostname」を返します。get ではなく POST リクエストを作成できるため、これは奇妙です。私が使用している URL はhttp://10.0.2.2/webapp/api/controllername(Android エミュレーターが 127.0.0.1 を使用するため、10.0.2.2 です。これは公開された回避策です)。インターネット許可を有効にしています。

現在デバッグ中の Web API があり、投稿要求をデバッグできます。get 要求の URL を Internet Explorer に手動で入力して、サーバーにアクセスできます。これは、私がそれが機能していることを知っている方法です。サーバーにアクセスしていることを確認するためだけに、application_beginrequest のハンドラーがあり、それはポスト リクエスト用です。しかし、get リクエストがサーバーに着信することさえありません。

Android GET リクエストを作成するために、以下を利用しました (追加情報を含むコメントを追加しました)。

//Creation of get request
HttpGet request = new HttpGet(url); //correct URL; verified
for(NameValuePair h : headers)
{
    //6 headers added; verified OK
    request.addHeader(h.getName(), h.getValue());
}
//Calls method shown below
return executeRequest(request, url);

 private ResponseInformation executeRequest(HttpUriRequest request, String url) throws Exception
{
    HttpClient client = new DefaultHttpClient();
    HttpResponse httpResponse;

    try {
        //Get the response and check the code/message
        httpResponse = client.execute(request);
        responseCode = httpResponse.getStatusLine().getStatusCode();
        message = httpResponse.getStatusLine().getReasonPhrase();

        HttpEntity entity = httpResponse.getEntity();
        ResponseInformation info; // just a DTO for my needs

        if (entity != null) {
            InputStream instream = entity.getContent();
            //Response is an XML document listing the 400 error information
            response = convertStreamToString(instream);
            info = new ResponseInformation(responseCode, response, message);
            instream.close();
        }
        else
            info = new ResponseInformation(responseCode, message);

        return info;

    }
    .
    .
}

誰が拒否しているのかわかりませんか?このエラーが発生するのはなぜですか? Application_BeginRequest にヒットすることはないため、Web API サービスには到達しませんが、POSTS は...とても奇妙です。

4

3 に答える 3

4

Web API セルフ ホストを使用して同じ問題が発生し、GET または POST のいずれかの要求を送信できません。

400 Invalid Hostname着信ホストとHostヘッダーが構成された IIS または自己ホストのホスト名と同じでない場合、 Web API は生成します。これを参照してください。ホストとAndroid エミュレーター内で (WireShark は Windows でループバック IP を監視できません)を使用します。ヘッダーはどういうわけか自動的に 10.0.2.2 に設定されます。RawCaptcpdumpHost

10.0.2.2 の回避策なしで 127.0.0.1 を通過できるため、Fiddler を使用してもこの問題は発生しません。

これは、10.0.2.2 の特別な IP を使用し、Android アプリケーションの Http クライアント ライブラリがHostヘッダーを IP に自動的に設定する場合にのみ発生します。私の場合、使用しますRetrofitヘッダー 10.0.2.2 は 127.0.0.1 または localhost と同じではないため、Web API は 400 Invalid Hostname を生成しますHost

Host次に、ヘッダーを上書きするlocalhost:portと、単純に機能します。

RestAdapter.Builder builder= new RestAdapter.Builder()
.setRequestInterceptor(new RequestInterceptor() {
     @Override
     public void intercept(RequestFacade request) {
         if (HOST.contains("10.0.2.2")) { // HOST = "http://10.0.2.2/api";
             request.addHeader("Host", "localhost");
         }            
     }
 });

HostAndroid アプリのヘッダーが正しいことを確認してください。

于 2014-10-26T05:35:03.470 に答える
2

「wireshark」を試してネットワーク トラフィックをキャプチャし、何が問題なのかを確認してください。次に、表示される HTTP 要求を wget または curl でエミュレートしてみてください。そうすれば、サービスが失敗する原因を特定できるはずです。

于 2013-01-05T11:49:03.923 に答える
1

get リクエストが失敗し、存在しないエラー ページへのリダイレクトを実行している可能性は十分にあります。そのリダイレクトは、おそらく 10.0.2.2 の IP アドレスを使用していません。

直接 (IE/Fiddler/Whatever) 動作しているのにアプリケーションでは動作していない一般的な理由は、アプリケーションが別の手段でまったく同じものを実際に送信していない場合です。

最善の策は、Android にログを記録させるか、呼び出そうとしている正確なクエリ文字列を表示させることです。次に、外部テストがその呼び出しを実行していることを確認します。

あなたが持っている可能性のある標準エラーページのタイプをさらに調査し、実際の問題がわかるまでそれらをオフにする可能性があります.

于 2013-01-15T23:54:37.780 に答える