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!
Odpowiedzi:
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>
źródło
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.
źródło
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
źródło
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.
źródło
Gdybym to robił, prawdopodobnie użyłbym WCF REST na serwerze i biblioteki REST na kliencie Java / Android.
źródło