1

我有一个奇怪的问题。从我的 android 应用程序中,我正在调用 ASP.NET Web API。我可以毫无问题地从应用程序发出 POST 请求。但是,当我发出 GET 请求时,请求返回“400 bad request invalid hostname”。这很奇怪,因为我可以发出 POST 请求,而不是 get。我使用的 URL 是http://10.0.2.2/webapp/api/controllername(10.0.2.2,因为 android 模拟器使用 127.0.0.1;这是已发布的解决方法)。我确实启用了互联网权限。

我目前正在调试 Web API,并且可以调试发布请求。我可以在 Internet Explorer 中手动输入获取请求的 URL,然后点击服务器。这就是我知道它正在工作的方式。我有一个 application_beginrequest 处理程序,只是为了看到我什至正在访问服务器,它是用于发布请求的。但我什至从来没有看到一个获取请求进入服务器。

为了发出 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 模拟器中使用RawCap(WireShark 无法在 Windows 中监控环回 IP) 。tcpdumpHost头以某种方式自动设置为 10.0.2.2。

使用 Fiddler 看不到这个问题,因为如果没有 10.0.2.2 解决方法,您可以获得 127.0.0.1 的低谷。

只有当我们使用 10.0.2.2 特殊 IP 并且 Android 应用程序中的 Http 客户端库自动将Hostheader 设置为 IP 时才会发生这种情况。就我而言,我使用Retrofit. 由于Host标头 10.0.2.2 与 127.0.0.1 或 localhost 不同,Web API 会产生 400 Invalid Hostname。

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");
         }            
     }
 });

只需确保Host您的 Android 应用程序的标题是正确的。

于 2014-10-26T05:35:03.470 回答
2

尝试“wireshark”来捕获网络流量,看看出了什么问题。然后尝试使用 wget 或 curl 模拟您看到的 HTTP 请求。这样,您应该能够隔离导致服务失败的原因。

于 2013-01-05T11:49:03.923 回答
1

您的获取请求完全有可能失败并且正在执行重定向到不存在的错误页面。该重定向可能不使用 10.0.2.2 ip 地址。

您看到它直接工作(IE/Fiddler/Whatever)但不在您的应用程序中工作的一个常见原因是,如果应用程序实际上并没有通过其他方式发送与您完全相同的东西。

最好的办法是简单地让 android 记录或以其他方式向您显示它试图调用的确切查询字符串。然后确保您的外部测试正在执行该调用。

我会进一步调查您可能拥有的任何类型的标准错误页面,可能会关闭它们,直到您看到实际问题为止。

于 2013-01-15T23:54:37.780 回答