2009-03-21 12 views
74

Estoy creando un servidor en .NET y una aplicación cliente para Android. Me gustaría implementar un método de autenticación que envíe el nombre de usuario y la contraseña al servidor y un servidor devuelva una cadena de sesión.Cómo consumir WCF Service con Android

No estoy familiarizado con WCF, así que realmente agradecería su ayuda.

en Java que he escrito el siguiente método:

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

Pero en el lado del servidor hasta el momento no se han dado cuenta de nada.

Estaría muy agradecido si alguien pudiera explicar cómo crear una cadena de método apropiada Inicie sesión (string username, string password) con las configuraciones apropiadas de App.config e Interface con la firma apropiada [OperationContract] para leer estos dos parámetros de cliente y respuesta con cadena de sesión.

Gracias!

+2

Me encantaría ver una forma de consumir wcf binario serializado en android. Eso sí que sería genial. –

Respuesta

39

Para empezar con WCF, puede ser que sea más fácil de usar sólo el formato de SOAP predeterminado y HTTP POST (en lugar de GET) para la web - enlaces de servicio. El enlace HTTP más fácil para trabajar es "basicHttpBinding". Este es un ejemplo de lo que el ServiceContract/OperationContract podría ser similar para su servicio de entrada:

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

La implementación del servicio podría tener este aspecto:

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

puede alojar esto como un servicio de Windows utilizando un ServiceHost, o puede alojarlo en IIS como una aplicación web (servicio) ASP.NET normal. Hay muchos tutoriales para estos dos.

El WCF config servicio podría tener este aspecto:

<?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 El material es opcional para la producción, pero es necesario para las pruebas con WcfTestClient.exe, y para exponer los meta-datos de servicio).

Tendrá que modificar su código Java para PUBLICAR un mensaje SOAP al servicio. WCF puede ser un poco quisquilloso cuando interactúa con clientes que no son WCF, por lo que tendrá que meterse un poco con los encabezados de POST para que funcione. Una vez que lo ejecute, puede comenzar a investigar la seguridad del inicio de sesión (puede necesitar usar un enlace diferente para obtener una mejor seguridad), o posiblemente usar WCF REST para permitir inicios de sesión con un GET en lugar de SOAP/POST.

Aquí hay un ejemplo de cómo debería verse HTTP POST a partir del código de Java. Hay una herramienta llamada "Fiddler" que puede ser realmente útil para depurar servicios 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

¿Alguna idea sobre cómo obtener dúplex wcf-comunicación? El sondeo o el verdadero empuje no importa. – Alxandr

+1

Recomendaría la opción RESTO, SOAP le traerá más problemas que ventajas. Si usa REST con cifrado SSL, su servicio web será muy seguro. – Rafa

+4

Sí, recomendaría REST ahora también, esta respuesta fue de hace unos años cuando REST/JSON no eran tan frecuentes como lo son ahora. –

6

Necesitará algo más que una solicitud http para interactuar con un servicio WCF A MENOS QUE su servicio WCF tenga una interfaz REST. Busque una API de servicio web SOAP que se ejecute en Android o haga que su servicio sea RESTful. Necesitará .NET 3.5 SP1 para hacer los servicios WCF REST:

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

7

Otra opción podría ser evitar WCF all-together y simplemente usar .NET HttpHandler. El HttpHandler puede tomar las variables de cadena de consulta de su GET y simplemente escribir de nuevo una respuesta al código de Java.

+6

Puede hacer esto, pero sin un marco adecuado, se siente como esto sería frágil y difícil de mantener. ¿Cómo documentarías la interfaz REST para los clientes? ¿Qué pasa si quieres JSON? etc. etc. – Cheeso

3

Si estuviera haciendo esto, probablemente usaría WCF REST en el servidor y REST library en el cliente Java/Android.

4

Desde mi experiencia reciente, recomendaría la biblioteca ksoap para consumir un servicio WCF de Soap, es realmente muy fácil, esto anddev thread me ayuda también.

+0

ksoap usa XML y REST se recomienda para operaciones como esta. –