Jak korzystać z usługi WCF w systemie Android

79

Tworzę serwer w .NET oraz aplikację kliencką na Androida. Chciałbym zaimplementować metodę uwierzytelniania, która wysyła nazwę użytkownika i hasło do serwera, a serwer odsyła ciąg sesji.

Nie jestem zaznajomiony z WCF, więc byłbym bardzo wdzięczny za pomoc.

W Javie napisałem następującą metodę:

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

Ale po stronie serwera do tej pory nic nie wymyśliłem.

Byłbym naprawdę wdzięczny, gdyby ktoś mógł wyjaśnić, jak utworzyć odpowiedni ciąg metody Login (nazwa użytkownika, hasło) z odpowiednimi ustawieniami App.config i interfejsem z odpowiednim podpisem [OperationContract], aby odczytać te dwa parametry z klienta i odpowiedzieć za pomocą ciąg sesji.

Dzięki!

Niko Gamulin
źródło
2
Chciałbym zobaczyć sposób na wykorzystanie pliku binarnego wcf serializowanego na Androida. teraz to byłoby fajne.
Brady Moritz

Odpowiedzi:

41

Aby rozpocząć korzystanie z WCF, najłatwiej może być po prostu użyć domyślnego formatu SOAP i HTTP POST (zamiast GET) dla powiązań usługi sieci Web. Najłatwiejszym do uruchomienia powiązaniem HTTP jest „basicHttpBinding”. Oto przykład tego, jak może wyglądać umowa ServiceContract / OperationContract dla Twojej usługi logowania:

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

Realizacja usługi mogłaby wyglądać następująco:

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

Możesz hostować to jako usługę systemu Windows przy użyciu ServiceHost lub możesz hostować go w usługach IIS, tak jak zwykła aplikacja internetowa (usługa) ASP.NET. Istnieje wiele samouczków dotyczących obu tych zagadnień.

Konfiguracja usługi WCF może wyglądać następująco:

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

(Elementy MEX są opcjonalne dla produkcji, ale są potrzebne do testowania za pomocą WcfTestClient.exe i do ujawniania metadanych usługi).

Będziesz musiał zmodyfikować swój kod Java, aby wysłać wiadomość SOAP do usługi. WCF może być trochę wybredny podczas współpracy z klientami spoza WCF, więc będziesz musiał trochę zepsuć nagłówki POST, aby działało. Po uruchomieniu możesz rozpocząć badanie bezpieczeństwa logowania (może być konieczne użycie innego powiązania, aby uzyskać lepsze zabezpieczenia) lub ewentualnie użyć funkcji WCF REST, aby zezwolić na logowanie za pomocą GET, a nie SOAP / POST.

Oto przykład tego, jak powinien wyglądać HTTP POST z kodu Java. Istnieje narzędzie o nazwie „ Fiddler ”, które może być naprawdę przydatne do debugowania usług internetowych.

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
źródło
1
Masz jakiś pomysł, jak uzyskać dupleksową komunikację wcf? Polling lub true push nie mają znaczenia.
Alxandr
1
Poleciłbym opcję REST, SOAP przyniesie więcej problemów niż korzyści. Jeśli używasz REST z szyfrowaniem SSL, Twoja usługa internetowa będzie bardzo bezpieczna.
Rafa,
4
Tak, teraz również poleciłbym REST, ta odpowiedź pochodzi z kilku lat temu, kiedy REST / JSON nie były tak rozpowszechnione, jak są teraz.
Andy White
proszę zobaczyć post stackoverflow.com/questions/33183506/…
kartheeki j
7

Inną opcją może być unikanie funkcji WCF razem i po prostu użycie .NET HttpHandler. HttpHandler może pobrać zmienne ciągu zapytania z GET i po prostu zapisać odpowiedź na kod Java.

Andy White
źródło
6
Możesz to zrobić, ale bez odpowiedniej struktury wydaje się, że byłoby to delikatne i trudne do utrzymania. Jak udokumentowałbyś interfejs REST klientom? A co jeśli chcesz JSON? itp. itp.
Cheeso
6

Będziesz potrzebować czegoś więcej niż żądanie http do interakcji z usługą WCF, chyba że Twoja usługa WCF ma interfejs REST. Poszukaj interfejsu API usługi sieci Web SOAP, który działa w systemie Android, lub spraw, aby usługa była REST. Aby korzystać z usług WCF REST, będziesz potrzebować platformy .NET 3.5 SP1:

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

Jonathan Parker
źródło
4

Z mojego niedawnego doświadczenia polecam bibliotekę ksoap do korzystania z usługi Soap WCF, jest to naprawdę bardzo łatwe, ten wątek anddev może ci również pomóc.

Necronet
źródło
ksoap używa XML i REST jest zalecany do takich operacji.
Sreekanth Karumanaghat,
3

Gdybym to robił, prawdopodobnie użyłbym WCF REST na serwerze i biblioteki REST na kliencie Java / Android.

Ser
źródło