So nutzen Sie den WCF-Dienst mit Android

79

Ich erstelle einen Server in .NET und eine Client-Anwendung für Android. Ich möchte eine Authentifizierungsmethode implementieren, die Benutzername und Passwort an den Server sendet und ein Server sendet eine Sitzungszeichenfolge zurück.

Ich bin mit WCF nicht vertraut, daher würde ich mich sehr über Ihre Hilfe freuen.

In Java habe ich folgende Methode geschrieben:

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

Aber auf der Serverseite habe ich bisher nichts herausgefunden.

Ich wäre wirklich dankbar, wenn jemand erklären könnte, wie eine geeignete Methodenzeichenfolge Login (Zeichenfolge Benutzername, Zeichenfolge Passwort) mit den entsprechenden App.config-Einstellungen und der Schnittstelle mit der entsprechenden [OperationContract] -Signatur erstellt wird, um diese beiden Parameter vom Client zu lesen und mit zu antworten Sitzungszeichenfolge.

Vielen Dank!

Niko Gamulin
quelle
2
Ich würde gerne einen Weg finden, um auf Android serialisierte wcf-Binärdateien zu konsumieren. das wäre cool
Brady Moritz

Antworten:

41

Um mit WCF zu beginnen, ist es möglicherweise am einfachsten, nur das Standard-SOAP-Format und den HTTP-POST (anstelle von GET) für die Webdienstbindungen zu verwenden. Die einfachste HTTP-Bindung, um zum Laufen zu kommen, ist "basicHttpBinding". Hier ist ein Beispiel dafür, wie der ServiceContract / OperationContract für Ihren Anmeldedienst aussehen könnte:

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

Die Implementierung des Dienstes könnte folgendermaßen aussehen:

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

Sie können dies als Windows-Dienst mit einem ServiceHost oder wie eine normale ASP.NET-Webanwendung (Dienstanwendung) in IIS hosten. Für beide gibt es viele Tutorials.

Die WCF-Dienstkonfiguration könnte folgendermaßen aussehen:

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

(Das MEX-Material ist für die Produktion optional, wird jedoch zum Testen mit WcfTestClient.exe und zum Offenlegen der Service-Metadaten benötigt.)

Sie müssen Ihren Java-Code ändern, um eine SOAP-Nachricht an den Dienst zu senden. WCF kann bei der Zusammenarbeit mit Nicht-WCF-Clients etwas wählerisch sein, sodass Sie ein wenig mit den POST-Headern herumspielen müssen, damit es funktioniert. Sobald Sie dies zum Laufen gebracht haben, können Sie die Sicherheit für die Anmeldung untersuchen (möglicherweise muss eine andere Bindung verwendet werden, um eine bessere Sicherheit zu erzielen) oder möglicherweise WCF REST verwenden, um Anmeldungen mit einem GET anstelle von SOAP / POST zu ermöglichen.

Hier ist ein Beispiel dafür, wie der HTTP-POST aus dem Java-Code aussehen sollte. Es gibt ein Tool namens " Fiddler ", das zum Debuggen von Webdiensten sehr nützlich sein kann.

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>
Andy White
quelle
1
Irgendeine Idee, wie man Duplex-Wcf-Kommunikation bekommt? Polling oder True Push spielen keine Rolle.
Alxandr
1
Ich würde die REST-Option empfehlen, SOAP bringt Ihnen mehr Probleme als Vorteile. Wenn Sie REST mit SSL-Verschlüsselung verwenden, ist Ihr Webdienst sehr sicher.
Rafa
4
Ja, ich würde REST jetzt auch empfehlen. Diese Antwort stammt von vor einigen Jahren, als REST / JSON nicht so verbreitet waren wie jetzt.
Andy White
Bitte lesen
kartheeki j
7

Eine andere Möglichkeit könnte darin bestehen, WCF insgesamt zu vermeiden und einfach einen .NET HttpHandler zu verwenden. Der HttpHandler kann die Abfragezeichenfolgenvariablen aus Ihrem GET abrufen und einfach eine Antwort auf den Java-Code zurückschreiben.

Andy White
quelle
6
Sie könnten dies tun, aber ohne einen geeigneten Rahmen scheint dies fragil und schwer zu warten zu sein. Wie würden Sie die REST-Schnittstelle für Clients dokumentieren? Was ist, wenn Sie JSON möchten? usw. usw.
Cheeso
6

Sie benötigen mehr als eine http-Anforderung, um mit einem WCF-Dienst zu interagieren, es sei denn, Ihr WCF-Dienst verfügt über eine REST-Schnittstelle. Suchen Sie entweder nach einer SOAP-Webdienst-API, die auf Android ausgeführt wird, oder machen Sie Ihren Dienst RESTful. Sie benötigen .NET 3.5 SP1, um WCF-REST-Services ausführen zu können:

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

Jonathan Parker
quelle
4

Aus meiner jüngsten Erfahrung würde ich die ksoap- Bibliothek empfehlen , um einen Soap WCF-Dienst zu nutzen. Es ist eigentlich ganz einfach. Dieser anddev- Thread könnte Ihnen auch helfen.

Necronet
quelle
ksoap verwendet XML und für solche Vorgänge wird REST empfohlen.
Sreekanth Karumanaghat
3

Wenn ich dies tun würde, würde ich wahrscheinlich WCF REST auf dem Server und eine REST-Bibliothek auf dem Java / Android-Client verwenden.

Cheeso
quelle