Androidアプリケーションから.NETサービス(WCF RESTful)を呼び出す

こんにちはhabrozhiteli!



最近、問題に遭遇しました。Javaから.NET WCFサービスを呼び出す必要がありました。 実装の例をいくつか見つけました。そのうちの1つを共有したいのですが、突然誰かが役に立ちます。 インターネットを調べてみたところ、 SOAPサービスのターンキーソリューションが見つかりました。 彼は彼に対処せず、検索を続けました。 次に、WCF RESTfulサービスを使用して、 JSON形式のデータを返すソリューションが見つかりました。 私はより詳細に理解し、その仕組みを試すことにしました。







したがって、まず最初にWCF RESTfulサービスを作成する必要があります。 まず、データコントラクトを定義します。

Message.cs


using System.Runtime.Serialization; namespace TestService { [DataContract] public class Message { [DataMember(Order = 1)] public string Header { get; set; } [DataMember(Order =2)] public string Body { get; set; } } }
      
      





Webサービスが返す要素の順序を設定するには、 Order = xを使用します。

次に、サービスコントラクトを定義します。

ITestService.cs


 using System.ServiceModel; using System.ServiceModel.Web; namespace TestService { [ServiceContract] public interface ITestService { [OperationContract] [WebGet(UriTemplate = "/GetMessage/?header={header}&?body={body}", ResponseFormat = WebMessageFormat.Json)] Message ComposeMessage(string header, string body); } }
      
      





UriTemplateの詳細については、 こちらをご覧ください

サービスを実現します。

TestService.svc.cs


 using System.ServiceModel.Activation; namespace TestService { public class TestService : ITestService { #region ITestService Members public Message ComposeMessage(string header, string body) { Message message = new Message() { Header = header, Body = body }; return message; } #endregion } }
      
      





そしてもちろん、サービス構成:

web.config


 <?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <system.serviceModel> <services> <service name="TestService.TestService"> <endpoint binding="webHttpBinding" contract="TestService.ITestService" behaviorConfiguration="webHttp"/> </service> </services> <behaviors> <endpointBehaviors> <behavior name="webHttp"> <webHttp helpEnabled="true"/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
      
      





IISでサービスをホストします(これは、Visual StudioまたはIISマネージャーで実行できます)。 仮想ディレクトリを作成し、 TestServiceと呼びます。

WCFが管理するIIS内でホストされている場合、WCFは通常、サービスの種類を示す.svcファイルと、エンドポイントについてWCFに通知するweb.configファイルのエントリ(他の設定の中でもバインドと動作)を必要とします。


そして最後の仕上げ:

TestService.svc


 <%@ ServiceHost Language="C#" Debug="true" Service="TestService.TestService" CodeBehind="TestService.svc.cs" %>
      
      





すべての手順を実行すると、仮想ディレクトリの内容はほぼ次のようになります。



binフォルダーには、サービスとともに* .dllが含まれている必要があります。

すべてのサービスの準備ができました。 結果をテストするために、ブラウザーのアドレスバーに次のように入力します。
localhost / TestService / TestService.svc / GetMessage /?header = Hello&?body = World
結果は次のようになります。

{「ヘッダー」:「こんにちは」、「ボディ」:「世界」}
これはJSONレスポンスです。

最後に、Androidアプリケーションに進みましょう。

この投稿を読み直すことをお勧めします。 それからAsyncTask実装を借ります。

すべてのコードを公開するのは理にかなっていないので、サービスから送信されたJSON応答を解析するメソッドのみをそこから「切り取り」ます。 彼のコードは次のとおりです。

 private String getMessage(String header, String body) { HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(_resources.getString(R.string.serviceAddress) + "/GetMessage/?header="+ header + "&?body=" + body); HttpResponse response; try { response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); String result = convertStreamToString(instream); JSONObject json = new JSONObject(result); // Parsing JSONArray nameArray = json.names(); JSONArray valArray = json.toJSONArray(nameArray); _getResponse = nameArray.getString(0) + "=" + valArray.getString(0) + ", " + nameArray.getString(1) + "=" + valArray.getString(1); instream.close(); } } catch (Exception e) { _getResponse = e.getMessage(); } return _getResponse; }
      
      





_serviceAddressサービスのアドレスは次のようになります。
10.0.2.2/TestService/TestService.svc
localhostにアクセスすると、 Connection Refused IOExceptionが発生するため(興味のある方はこちらで詳細をお読みください )。

また、アプリケーションがWebサービスを呼び出すことができるように、 uses-permissionを AndroidManifest.xmlファイルに追加する必要があります。

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





基本的に私が伝えたかったのはそれだけです...



ソース:
ここに横たわっています



便利なリンク:
ご清聴ありがとうございました!



All Articles