.net - Cómo consumir WCF Service con Android
rest (5)
Desde mi experiencia reciente, recomendaría la biblioteca ksoap para consumir un servicio WCF de Soap, realmente es muy fácil, y este thread ayudarte.
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.
No estoy familiarizado con WCF, así que realmente apreciaría su ayuda.
En Java, 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 por el lado del servidor hasta el momento no he descubierto nada.
Estaría muy agradecido si alguien pudiera explicar cómo crear una cadena de método apropiada Login (string username, string password) con las configuraciones apropiadas de App.config e Interface con la firma apropiada [OperationContract] para leer estos dos parámetros del cliente y responder con cadena de sesión.
¡Gracias!
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 realizar los servicios WCF REST:
Otra opción sería 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.
Para comenzar con WCF, podría ser más fácil usar el formato SOAP predeterminado y HTTP POST (en lugar de GET) para los enlaces del servicio web. El enlace HTTP más fácil para trabajar es "basicHttpBinding". Aquí hay un ejemplo de cómo se vería ServiceContract / OperationContract para su servicio de inicio de sesión:
[ServiceContract(Namespace="http://mycompany.com/LoginService")]
public interface ILoginService
{
[OperationContract]
string Login(string username, string password);
}
La implementación del servicio podría verse así:
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.
La configuración del servicio WCF podría verse así:
<?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>
(Las cosas de MEX son opcionales para la producción, pero se necesitan para probar con WcfTestClient.exe y para exponer los metadatos del 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. Existe 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>
Si estuviera haciendo esto, probablemente usaría WCF REST en el servidor y una biblioteca REST en el cliente Java / Android.