2009-03-21 16 views
74

私は.NETでサーバーを作成しており、Android用のクライアントアプリケーションを作成しています。私はサーバーにユーザー名とパスワードを送信する認証メソッドを実装したいと思いますし、サーバーはセッション文字列を送り返します。AndroidでWCFサービスを使用する方法

私はWCFに精通していないので、本当にありがとうございます。

は、Javaで私は、次のメソッドを書いている:

private void Login() 
{ 
    HttpClient httpClient = new DefaultHttpClient(); 
    try 
    { 
     String url = "http://192.168.1.5:8000/Login?username=test&password=test"; 

    HttpGet method = new HttpGet(new URI(url)); 
    HttpResponse response = httpClient.execute(method); 
    if (response != null) 
    { 
     Log.i("login", "received " + getResponse(response.getEntity())); 
    } 
    else 
    { 
     Log.i("login", "got a null response"); 
    } 
    } catch (IOException e) { 
    Log.e("error", e.getMessage()); 
    } catch (URISyntaxException e) { 
    Log.e("error", e.getMessage()); 
    } 
} 

private String getResponse(HttpEntity entity) 
{ 
    String response = ""; 

    try 
    { 
    int length = (int) entity.getContentLength(); 
    StringBuffer sb = new StringBuffer(length); 
    InputStreamReader isr = new InputStreamReader(entity.getContent(), "UTF-8"); 
    char buff[] = new char[length]; 
    int cnt; 
    while ((cnt = isr.read(buff, 0, length - 1)) > 0) 
    { 
     sb.append(buff, 0, cnt); 
    } 

     response = sb.toString(); 
     isr.close(); 
    } catch (IOException ioe) { 
    ioe.printStackTrace(); 
    } 

    return response; 
} 

しかし、サーバ側の

は、これまでのところ、私は何かを考え出したていません。

誰でも適切なメソッド文字列を作成する方法を説明できれば本当に感謝します。これらの2つのパラメータを読み込むには、適切なApp.config設定と適切な[OperationContract]署名付きのログイン(文字列ユーザー名、文字列パスワード)クライアントとセッション文字列で応答します。

ありがとうございます!

+2

私はアンドロイドでシリアル化されたwcfバイナリを消費する方法を見たいと思っています。今それはクールだ。 –

答えて

39

WCFを使い始めるには、それだけでWeb用のデフォルトのSOAP形式とHTTP POSTを(というよりもGET)を使用するのが最も簡単かもしれませんサービスバインディング。最も簡単なHTTPバインディングは "basicHttpBinding"です。ここでのServiceContract/OperationContractがあなたのログインサービスのためにどのように見えるかの例です:

[ServiceContract(Namespace="http://mycompany.com/LoginService")] 
public interface ILoginService 
{ 
    [OperationContract] 
    string Login(string username, string password); 
} 

サービスの実装は次のようになります。

public class LoginService : ILoginService 
{ 
    public string Login(string username, string password) 
    { 
     // Do something with username, password to get/create sessionId 
     // string sessionId = "12345678"; 
     string sessionId = OperationContext.Current.SessionId; 

     return sessionId; 
    } 
} 

WindowsサービスとしてこれをホストすることができますServiceHostを使用するか、通常のASP.NET Web(サービス)アプリケーションのようにIISでホストすることができます。これらの両方のためにそこに多くのチュートリアルがあります。

WCFサービスの設定は次のようになります。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 


    <system.serviceModel> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="LoginServiceBehavior"> 
        <serviceMetadata /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 

     <services> 
      <service name="WcfTest.LoginService" 
        behaviorConfiguration="LoginServiceBehavior" > 
       <host> 
        <baseAddresses> 
         <add baseAddress="http://somesite.com:55555/LoginService/" /> 
        </baseAddresses> 
       </host> 
       <endpoint name="LoginService" 
          address="" 
          binding="basicHttpBinding" 
          contract="WcfTest.ILoginService" /> 

       <endpoint name="LoginServiceMex" 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange" /> 
      </service> 
     </services> 
    </system.serviceModel> 
</configuration> 

(MEXのものは、生産のためのオプションですが、WcfTestClient.exeとテストのために、サービスのメタデータを公開するために必要とされています)。

サービスにSOAPメッセージをPOSTするようにJavaコードを変更する必要があります。 WCFは、WCF以外のクライアントと相互運用するときに少し気が利くかもしれません。そのため、POSTヘッダーを少し使いこなす必要があります。これを実行すると、ログインのセキュリティ(より良いセキュリティを得るために別のバインディングを使用する必要があります)を調べたり、WCF RESTを使用してSOAP/POSTではなくGETでログインできるようになります。

次は、HTTP POSTがJavaコードからどのように見えるかの例です。 Webサービスのデバッグに本当に便利なツール「Fiddler」があります。

POST /LoginService HTTP/1.1 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://mycompany.com/LoginService/ILoginService/Login" 
Host: somesite.com:55555 
Content-Length: 216 
Expect: 100-continue 
Connection: Keep-Alive 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body> 
<Login xmlns="http://mycompany.com/LoginService"> 
<username>Blah</username> 
<password>Blah2</password> 
</Login> 
</s:Body> 
</s:Envelope> 
+1

どのように二重化wcf-communicationを得るための任意のアイデアですか?ポーリングや真のプッシュは関係ありません。 – Alxandr

+1

私はRESTオプションをお勧めします。SOAPは利点よりも多くの問題をもたらします。 SSL暗号化でRESTを使用する場合、Webサービスは非常に安全です。 – Rafa

+4

ええ、今でもRESTをお勧めします。この回答は、数年前のREST/JSONが現在と同様に普及していないときからのものでした。 –

6

WCFサービスにRESTインターフェイスがある場合を除いて、WCFサービスと対話するためのHTTP要求が必要です。 Android上で動作するSOAP WebサービスAPIを探したり、サービスをRESTfulにしたりしてください。あなたはWCF RESTサービスを行うには、.NET 3.5 SP1が必要になります。

http://msdn.microsoft.com/en-us/netframework/dd547388.aspx

7

もう1つの選択肢は、WCFを一緒に避け、.NET HttpHandlerを使用することです。 HttpHandlerは、GETからクエリ文字列変数を取得し、Javaコードへの応答を書き戻すだけです。

+6

あなたはこれを行うことができますが、適切なフレームワークがなければ、このように感じます壊れやすく、維持しがたいでしょう。どのようにクライアントにRESTインターフェースを文書化しますか? JSONが必要な場合はどうすればいいですか? – Cheeso

3

これを実行していた場合は、おそらくサーバーでWCF RESTを使用し、Java/AndroidクライアントでREST libraryを使用します。

4

私の最近の経験から、ksoapのSoC WCFサービスを利用することをお勧めします。その実際には簡単なthisdedev thread mighもお手伝いします。

+0

ksoapはXMLを使用しており、このような操作にはRESTが推奨されています。 –

関連する問題