Jak korzystać z usługi WCF z Androidem

Tworzę serwer w. NET i 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 łańcuch sesji.

Nie znam WCF, więc będę 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łabym bardzo wdzięczna, gdyby ktoś mógł wyjaśnić, jak Utwórz odpowiednią metodę string Login (string username, string password) z odpowiednią aplikacją.ustawienia konfiguracyjne i interfejs z odpowiednim podpisem [OperationContract], aby odczytać te dwa parametry z klienta i odpowiedzieć ciągiem sesji. Dzięki!
Author: Niko Gamulin, 2009-03-21

5 answers

Aby rozpocząć korzystanie z WCF, najłatwiej jest użyć domyślnego formatu SOAP i HTTP POST (zamiast GET) dla wiązań usług internetowych. Najprostszym wiązaniem HTTP do uruchomienia jest "basicHttpBinding". Oto przykład, jak może wyglądać ServiceContract/OperationContract dla Twojej usługi logowania:

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

Implementacja usługi może wyglądać tak:

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 go hostować jako usługę windows za pomocą ServiceHost lub możesz go hostować w IIS jak normalny ASP.NET aplikacja internetowa (usługowa). Istnieje wiele samouczków do obu z nich.

Konfiguracja usługi WCF może wyglądać tak:

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

(Materiał MEX jest opcjonalny do produkcji, ale jest potrzebny do testowania z WcfTestClient.exe, oraz do ujawniania metadanych serwisu).

Będziesz musiał zmodyfikować kod Javy, aby wysłać wiadomość SOAP do serwisu. WCF może być trochę wybredny, gdy współpracuje z klientami spoza WCF, więc będziesz musiał bałagan z nagłówkami postów trochę, aby to zadziałało. Po uruchomieniu, możesz zacząć badać bezpieczeństwo logowania (może być konieczne użycie innego wiązania, aby uzyskać lepsze bezpieczeństwo) lub ewentualnie użyć WCF REST, aby umożliwić logowanie za pomocą GET zamiast SOAP/POST.

Oto przykład jak powinien wyglądać Post HTTP z kodu Javy. 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>
 40
Author: Andy White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 11:05:11

Inną opcją może być uniknięcie WCF all-together i po prostu użycie. NET HttpHandler. HttpHandler może pobrać zmienne ciągu zapytania z GET i po prostu napisać odpowiedź na kod Java.

 7
Author: Andy White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 02:10:19

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 internetowej SOAP działającego na Androidzie lub spraw, aby usługa była RESTful. Będziesz potrzebował. NET 3.5 SP1 do wykonywania usług WCF REST:

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

 6
Author: Jonathan Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-23 00:01:32

Z mojego niedawnego doświadczenia polecam ksoapbibliotekę do korzystania z usługi soap WCF, to naprawdę proste, ten idev wątek może Ci też pomóc.

 4
Author: Necronet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 02:41:09

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

 3
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:05