2009-03-21 17 views
74

Sto creando un server in .NET e un'applicazione client per Android. Vorrei implementare un metodo di autenticazione che manda nome utente e password al server e un server restituisce una stringa di sessione.Come utilizzare il servizio WCF con Android

Non ho familiarità con WCF, quindi gradirei davvero il vostro aiuto.

in Java ho scritto il seguente metodo:

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

Ma sul lato server finora non ho capito nulla.

Sarei davvero grato se qualcuno potesse spiegare come creare una stringa di metodo appropriata Login (nome utente stringa, password stringa) con impostazioni App.config appropriate e interfaccia con firma appropriata [OperationContract] per leggere questi due parametri da client e rispondere con una stringa di sessione.

Grazie!

+2

Mi piacerebbe vedere un modo per utilizzare wcf serializzato su Android. ora sarebbe bello. –

risposta

39

per iniziare con WCF, potrebbe essere più facile da usare solo il formato predefinito SOAP e HTTP POST (invece che GET) per il web -service binding. L'associazione HTTP più semplice da utilizzare è "basicHttpBinding". Ecco un esempio di ciò che il ServiceContract/OperationContract potrebbe essere simile per il vostro servizio di login:

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

L'attuazione del servizio potrebbe assomigliare a questo:

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

è possibile ospitare questo come un servizio di Windows utilizzando un ServiceHost o è possibile ospitarli in IIS come una normale applicazione Web (servizio) ASP.NET. Ci sono molti tutorial là fuori per entrambi. servizio

La WCF config potrebbe assomigliare a questo:

<?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> 

(La roba MEX è facoltativo per la produzione, ma è necessaria per il test con WcfTestClient.exe, e per esporre i meta-dati del servizio).

Dovrai modificare il codice Java per inviare un messaggio SOAP al servizio. WCF può essere un po 'schizzinoso quando interagisce con i client non-WCF, quindi dovrete arrangiarvi un po' con le intestazioni POST per farlo funzionare. Una volta che questo è stato eseguito, è possibile iniziare a indagare sulla sicurezza per l'accesso (potrebbe essere necessario utilizzare un binding diverso per ottenere una maggiore sicurezza) o eventualmente usare WCF REST per consentire accessi con GET piuttosto che SOAP/POST.

Ecco un esempio di come dovrebbe apparire il POST HTTP dal codice Java. C'è uno strumento chiamato "Fiddler" che può essere davvero utile per il debug dei servizi web.

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

Qualche idea su come ottenere duplex wcf-comunication? Polling o true push non contano. – Alxandr

+1

Vorrei raccomandare l'opzione REST, SOAP ti porterà più problemi che vantaggi. Se utilizzi REST con crittografia SSL, il tuo servizio web sarà molto sicuro. – Rafa

+4

Sì, vorrei raccomandare ora anche REST, questa risposta era di alcuni anni fa quando REST/JSON non erano così diffusi come lo sono ora. –

6

Avrete bisogno di qualcosa di più che una richiesta http per interagire con un servizio WCF A MENO CHE il vostro servizio WCF abbia un'interfaccia REST. O cerca un'API del servizio web SOAP che funzioni su Android o rendi il tuo servizio RESTful. Avrete bisogno di .NET 3.5 SP1 per fare servizi WCF REST:

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

7

Un'altra opzione potrebbe essere quella di evitare il WCF in blocco e utilizzare solo un HttpHandler .NET. HttpHandler può catturare le variabili stringa di query dal tuo GET e semplicemente scrivere una risposta al codice Java.

+6

Si potrebbe fare questo, ma senza un quadro adeguato, si sente come questo sarebbe fragile e difficile da mantenere Come documenteresti l'interfaccia REST ai clienti? Cosa succede se vuoi JSON? ecc. ecc. – Cheeso

3

Se lo facessi probabilmente utilizzerei WCF REST sul server e uno REST library sul client Java/Android.

4

Dalla mia recente esperienza vorrei raccomandare la libreria ksoap per consumare un servizio WCF Soap, in realtà è davvero facile, questo edev thread può essere d'aiuto.

+0

ksoap usa XML e REST è raccomandato per le operazioni come questa. –

Problemi correlati