77 votes

Comment utiliser le service WCF avec Android

Je suis entrain de créer un serveur .NET et d'une application client pour Android. Je tiens à mettre en œuvre une méthode d'authentification qui envoie le nom d'utilisateur et mot de passe pour le serveur et un serveur renvoie une session de chaîne.

Je ne suis pas familier avec WCF donc, je serais vraiment reconnaissant de votre aide.

En java, j'ai écrit la méthode suivante:

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;
}

Mais du côté du serveur jusqu'à présent, je n'ai pas compris quoi que ce soit.

Je serais vraiment reconnaissant si quelqu'un pourrait expliquer comment créer une méthode appropriée de la chaîne de Connexion(string username, string password) avec Application appropriée.paramètres de configuration et Interface appropriée [OperationContract] signature pour lire ces deux paramètres à partir d'un client et de répondre à la session de la chaîne.

Merci!

41voto

Andy White Points 36586

Pour commencer avec WCF, il pourrait être plus facile de simplement utiliser la valeur par défaut du SAVON format et HTTP POST (plutôt que de l'OBTENIR) pour le web, pour les liaisons de service. La méthode la plus simple liaison HTTP pour obtenir de travail est "basicHttpBinding". Voici un exemple de ce que le ServiceContract/OperationContract pourrait ressembler votre service de connexion:

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

La mise en œuvre du service pourrait ressembler à ceci:

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

        return sessionId;
    }
}

Vous pouvez être l'hôte de cette en tant que service windows à l'aide d'un ServiceHost, ou vous pouvez l'héberger dans IIS comme un normal ASP.NET web (service) de l'application. Il y a beaucoup de tutoriels pour les deux de ces.

Le service WCF config pourrait ressembler à ceci:

<?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 truc est facultatif pour la production, mais est nécessaire pour le test avec WcfTestClient.exe et pour exposer le service de méta-données).

Vous devrez modifier votre code Java pour POSTER un message SOAP pour le service. WCF peut être un peu pointilleux lors de l'inter-fonctionnement avec des non-WCF clients, de sorte que vous aurez à jouer avec le POST-têtes un peu pour le faire fonctionner. Une fois que vous obtenez ce en cours d'exécution, vous pouvez alors commencer à enquêter sur la sécurité de la connexion (peut-être besoin d'utiliser un autre liaison pour obtenir une meilleure sécurité), ou éventuellement en utilisant WCF REST afin de permettre des connexions avec un OBTENIR, plutôt que le SAVON/la POSTE.

Voici un exemple de ce que le HTTP POST devrait ressembler à du code Java. Il existe un outil appelé "Fiddler" qui peut être vraiment utile pour le débogage des web-services.

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>

7voto

Andy White Points 36586

Une autre option pourrait être d'éviter WCF dans son ensemble et d'utiliser simplement un .NET HttpHandler. HttpHandler peut récupérer les variables de chaîne de requête dans votre GET et simplement écrire une réponse dans le code Java.

6voto

Jonathan Parker Points 4206

Vous aurez besoin de quelque chose de plus qu'une requête http pour interagir avec un service WCF SAUF SI votre service WCF possède une interface REST. Recherchez une API de service Web SOAP qui s'exécute sur Android ou rendez votre service RESTful. Vous aurez besoin de .NET 3.5 SP1 pour créer des services WCF REST:

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

4voto

Necronet Points 3212

D'après ma récente expérience, je recommanderais à la bibliothèque ksoap de consommer un service Soap WCF, c'est en fait vraiment facile, ce fil anddev peut vous aider aussi.

3voto

Cheeso Points 87022

Si je le faisais, j'utiliserais probablement WCF REST sur le serveur et une bibliothèque REST sur le client Java / Android.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X