如何使用 Android 的 WCF 服务

我正在创建一个服务器。NET 和 Android 的客户端应用程序。我想实现一个身份验证方法,它将用户名和密码发送到服务器,服务器发回一个会话字符串。

我不熟悉周转基金,所以我真的很感激你的帮助。

在 java 中,我写了以下方法:

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

但是在服务器端,目前为止我还没有找到任何东西。

如果有人能解释一下如何创建一个具有适当 App.config 设置的适当方法 string Login (string username,string password)和具有适当[ OperationContract]签名的 Interface,以便从客户端读取这两个参数并用会话字符串进行回复,我将非常感激。

谢谢!

103658 次浏览

除非您的 WCF 服务具有 REST 接口,否则您将需要更多的 http 请求来与 WCF 服务交互。要么寻找运行在 android 上的 SOAPWeb 服务 API,要么使您的服务 RESTful。你需要。NET 3.5 SP1做 WCF REST 服务:

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

要开始使用 WCF,最简单的方法可能就是对 Web 服务绑定使用默认的 SOAP 格式和 HTTP POST (而不是 GET)。最简单的 HTTP 绑定是“ basicHttpBinding”。这里有一个示例,展示了登录服务的 ServiceContract/OperationContract2可能是什么样子:

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

服务的实现可以是这样的:

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

您可以使用 ServiceHost 将其作为 Windows 服务托管,也可以像普通的 ASP.NET Web (服务)应用程序一样将其托管在 IIS 中。有很多关于这两种方法的教程。

WCF 服务配置可能如下所示:

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

(MEX 对于生产来说是可选的,但是对于使用 WcfTestClient.exe 进行测试和公开服务元数据来说是必需的)。

您必须修改 Java 代码,以便向服务发送 SOAP 消息。在与非 WCF 客户机进行交互操作时,WCF 可能有点挑剔,因此您必须稍微改动一下 POST 头才能使其工作。一旦运行了这个命令,您就可以开始研究登录的安全性(可能需要使用不同的绑定来获得更好的安全性) ,或者可能使用 WCF REST 来允许使用 GET 而不是 SOAP/POST 登录。

下面是从 Java 代码看 HTTPPOST 应该是什么样子的一个示例。有一个叫做“ 小提琴手”的工具对于调试 Web 服务非常有用。

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>

另一种选择可能是完全避免 WCF,只使用。NET HttpHandler.HttpHandler 可以从 GET 中获取查询字符串变量,并只回写对 Java 代码的响应。

如果我这样做,我可能会在服务器上使用 WCF REST,在 Java/Android 客户机上使用 REST 库

从我最近的经验,我会建议 肥皂库消费肥皂 WCF 服务,其实真的很容易,这和开发 线可能会帮助你太多。