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!
Antworten:
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>
quelle
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.
quelle
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
quelle
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.
quelle
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.
quelle