2016-01-26 103 views
0

所以我上傳了以下問題幾次,並沒有真正得到一個教程類答案。以下是我發現的解決此問題的方法:從Android設備訪問ASMX網絡服務

我需要從LAN(Android設備)中的其他設備訪問我的asmx Web服務,但它在Visual Studio的本地主機上運行。如何將HTTP消息發送到位於不同計算機上的Web服務?

回答

1

因此,我們需要做的是如下:

1)創建你的ASP空的Web應用程序,添加一個ASMX Web服務。轉到項目的屬性(Web選項卡),然後選擇Web服務作爲開始操作(以防止嘗試打開配置文件)。在Project URL行更改端口,你想和創建虛擬目錄:

Project settings in Visual Studio 2013

2)現在對我的項目,我想補充支持POST和GET消息。爲了做到這一點,去web.config文件,並添加<configuration>標記中下面的代碼:

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

3),我們要做的第三件事是綁定的計算機的實際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你可以只寫*,但是又在你只想知道,而不是用它設置IP地址的Android應用EditText等。在這個階段之後,您可以通過輸入http://YOUR_IP:YOUR_PORT/YOUR_WEB_SERVICE_NAME.asmx/FUNCTION來測試webservice,並確保它返回一個有效值。

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類中的代碼如下:

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的功能)和將其保存到本地變量(響應)。

就這樣!希望這一切都爲你工作。