我在.NET中创建了一个名为“Login”的web服务方法,并在我的本地主机(IIS)中发布了它。该方法只接受两个字符串参数(用户名和密码),检查我在我的sql服务器中拥有的数据库中是否有与这些参数匹配的用户,如果它发现有人返回1,则返回0。从我的浏览器看,一切都很好。
我试图通过一个android应用程序达到这个方法(一开始只需将结果显示在屏幕上)。下面是代码(我从这里到那里找到了很多位):
public class LoginCheck extends Activity {
private static final String SOAP_ACTION = "http://tabtobook.org/Login";
private static final String METHOD_NAME = "Login";
private static final String NAMESPACE = "http://tabtobook.org/";
private static final String URL = "http://192.168.1.2/TabBookServices/Users.asmx";
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
/** Called when the activity is first created. */
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
ServiceCall();
}
public void ServiceCall()
{
try{
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
String A="user1";
request.addProperty("Username", A);
String B="user1";
request.addProperty("Password", B);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject)envelope.getResponse();
tv.setText(result.toString());
}
catch (final IOException e)
{
((TextView) findViewById(R.id.tView)).setText("test3");
e.printStackTrace();
} catch (final XmlPullParserException e)
{
e.printStackTrace();
} catch (final Exception e)
{
e.printStackTrace();
}
}
}
从我的调试到目前为止,程序抛出了“最后一个异常e”(我的代码中的最后一个异常),当它出现在“androidHttpTransport.call(SOAP_ACTION,信封);”行时。我从WSDL中得到:
targetNamespace="http://tabtobook.org/", location="http://localhost/TabBookServices/Users.asmx, soapAction="http://tabtobook.org/Login"
(我没有全部复制,因为我在这里做不到是有原因的。无论如何,在同一个web服务中还有其他不相关的方法),所以我认为我的名称空间、METHOD_NAME、SOAP_ACTION和URL是正确的。但作为一个肥皂新手,我不确定。
那怎么回事?请求信封是否格式错误,还是使用androidHttpTransport错误?(或者两者兼而有之!)
编辑:我在日志中放了几行。我认为是"android.os.NetworkOnMainThreadException“抛出了异常。我应该尝试一些类似于Asynchtask的东西来处理它吗?
11-11 21:17:53.607: D/AndroidRuntime(4574):关闭VM 11-11 21:17:53.667: I/AndroidRuntime(4574):注意:连接线程'Binder Thread #3‘失败11-11 21:53.667: D/dalvikvm(4574):GC_CONCURRENT释放了102 K,77%释放了483 k/2048K,暂停了1ms+3ms 11-11 21:17:53.667: D/dalvikvm(4574):对象注册表有一个条目11-11 21:17:54.117: W/System.err(4491):android.os.NetworkOnMainThreadException 11-11 21:17:54.237: W/System.err(4491):at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74) 11-11 21:17:54.237: W/System.err(4491):在libcore.io.BlockGuardOs.connect(BlockGuardOs.java:74) 11-11 21:17:54.248: Wlibcore.io.IoBridge.connectErrno(IoBridge.java:127) 11-11 21:17:54.248: W/System.err(4491):libcore.io.IoBridge.connect(IoBridge.java:112) 11-11 21:17:54.298: W/System.err(4491):java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 11-11 21:17:54.298: W/System.err(4491 )):java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 11-11 21:17:54.298: W/System.err(4491):at java.net.Socket.connect(Socket.java:842) 11-11 21:17:54.307: W/System.err(4491):at libcore.net.http.HttpConnection.(HttpConnection.java:77) 11-11 21:17:54.317: W/System.err(4491):atlibcore.net.http.HttpConnection.(HttpConnection.java:50)
我使用Asynchtask完成了它:(我不编辑第一篇文章,这样所有的内容都存在于其中)
private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
String A="user2";
request.addProperty("Username", A);
String B="user2";
request.addProperty("Password", B);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result = (SoapObject)envelope.bodyIn;
response=result.toString();
}
catch (Exception e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
tv.setText(result);
}
}
public void ServiceCall() {
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute();
}
}
如果用户存在,则屏幕上显示的是"LoginResponse{LoginResult=1;}“,如果用户不存在,则为”LoginResponse{LoginResult=0;}“。所以这个方法很好!
现在,我有两个问题要让它成为我想要的登录模块(当然,我会搜索那些):
,
编辑:第二,我在这里找到了答案,-> Android: How can I pass parameters to AsyncTask's onPreExecute()?
编辑:对于第一,所缺少的只是一个空间!
if(result.equals("LoginResponse{LoginResult=1; }"))
工作得很好!不过,我想知道如何得到正确的方法结果(0或1)。如果有人知道,请回答!
发布于 2011-11-11 21:55:29
请提供有关如何设置Dot.Net服务的更多信息。特别是您正在使用的绑定类型和正在使用的Dot.Net框架的版本。
在异构客户端环境中使用Dot.Net WCF服务的最佳方法是构建一个简单的Java来使用该服务,以确保您的WCF堆栈上的绑定和安全配置是以其他技术可以使用的开放方式设置的。例如,在WCF4.0中,除basicHttpBinding之外的每种绑定类型都提供用户身份验证和传输安全性,这要求客户端在功能上兼容。
一旦您证明了异构Java客户机,您也将更好地理解其他非WCF客户端需要做什么。
按照同样的思路,也尝试使用SoapUI使用您的WCF服务。它是一个Java工具,实现了在异构环境中验证您的服务的相同目标。
https://stackoverflow.com/questions/8097347
复制相似问题