从 Android 台设备访问 ASMX 网络服务

Access ASMX web service from an Android device

所以我已经将以下问题上传了几次,但并没有真正得到教程式的答案。这是我找到的解决此问题的方法:

我需要从 LAN 中的另一台设备(Android 设备)访问我的 asmx Web 服务,但它是 运行 在 Visual Studio 的本地主机上。如何将 HTTP 消息发送到另一台计算机上的 Web 服务?

所以我们需要做的是:

1) 创建您的 ASP 空 Web 应用程序,添加 ASMX Web 服务。转到项目的属性(Web 选项卡),然后选择 Web 服务作为启动操作(以防止它尝试打开配置文件)。在项目 URL 行中根据需要更改端口并创建虚拟目录:

2) 现在在我的项目中,我想添加对 POST 和 GET 消息的支持。为此,转到 web.config 文件并在 <configuration> 标记内添加以下代码:

<system.web>
    <webServices>
      <protocols>
          <add name="HttpGet"/>
          <add name="HttpPost"/>
      </protocols>
    </webServices>
</system.web> 

3) 我们要做的第三件事是将localhost 与计算机的实际IP 地址绑定。我的笔记本电脑有一个固定的 IP (192.168.1.10),这使得应用程序的编程更简单,但任何 IP 都可以。转到您的文档文件夹,然后编辑 IISExpress/config/applicationhost.config。找到 <sites> 标签,并在其中找到您的项目名称。更改 <bindings> 标签,使其看起来像这样:

<bindings>
     <binding protocol="http" bindingInformation="*:4250:192.168.1.10" />
     <binding protocol="http" bindingInformation="*:4250:localhost" />
</bindings>

现在您可以只写 * 而不是 192.168.1.10,但是在 android 应用程序中您只想知道 IP 地址,而不是使用 EditText 等设置它。在这个阶段之后,您可以通过键入 http://YOUR_IP:YOUR_PORT/YOUR_WEB_SERVICE_NAME.asmx/FUNCTION 并确保它 returns 是一个有效值来测试网络服务。

4) 现在,为了阻止计算机的防火墙丢弃消息,您可以创建一个例外(在所选端口内)或直接关闭防火墙。否则,您的 android 应用程序将在 HTTP 消息的执行过程中卡住并等待超时(这需要很长时间才能调试,因为它不会抛出异常)。

5) 构建您的 android 应用程序:我不会提供所有代码,但有一个按钮调用 AsyncTask 以发送 HTTP GET 消息。重要的是向应用程序添加权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

我的 AsyncTask class 中的代码如下:

HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet("http://192.168.1.10:4250/WebService1.asmx/HelloWorld");
            HttpResponse httpresponse = client.execute(get);
            HttpEntity httpEntity = httpresponse.getEntity();

            if (httpresponse.getStatusLine().getStatusCode() == 200) {
                InputStream is = httpEntity.getContent();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
                String text;
                while ((text = bufferedReader.readLine()) != null) {
                    response += text;
                }

它所做的基本上是获取返回的字符串(从 HelloWorld 函数)并将其保存到局部变量(response)。

就是这样!希望这一切对你有用。