最近、問題に遭遇しました。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.svclocalhostにアクセスすると、 Connection Refused IOExceptionが発生するため(興味のある方はこちらで詳細をお読みください )。
また、アプリケーションがWebサービスを呼び出すことができるように、 uses-permissionを AndroidManifest.xmlファイルに追加する必要があります。
<uses-permission android:name="android.permission.INTERNET" />
基本的に私が伝えたかったのはそれだけです...