ksoap2 调用 .net webservice 问题【高分】
初学android开发,谢谢大家帮忙。贴上代码:
c# webservice:
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
[WebService(Namespace = "http://tempuri.org/")]
[SoapRpcService]//指定使用rpc方式
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
//[System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
public Service () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
[WebMethod]
public string TestOne(string str1)
{
return "Test" + str1;
}
}
备注:发布后,手机连数据线,能根据IP地址使用浏览器访问web服务;
客户端代码:
package com.example.webservicetest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.serialization.*;
public class MainActivity extends Activity {
private EditText userName;
private EditText userPass;
private Button btnLogin;
private Button btnClose;
private TextView tv;
final String SOAP_ACTION = "http://tempuri.org/HelloWorld";
private static final String METHOD_NAME = "HelloWorld";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://192.168.0.113/TestServer/Service.asmx?WSDL";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnLogin = (Button) findViewById(R.id.button1);
btnClose = (Button) findViewById(R.id.button2);
userName = (EditText) findViewById(R.id.edit1);
userPass = (EditText) findViewById(R.id.edit2);
tv = (TextView)findViewById(R.id.tv);
btnLogin.setOnClickListener(new myClick());
}
private class myClick implements OnClickListener {
@Override
public void onClick(View v)
{
try
{
//调用.net 的WebService.
//设置连接参数
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//增加属性参数。 将相关的函数参数放入到过程中。
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//soap协议版本必须用SoapEnvelope.VER11(Soap V1.1);
//注意:这个属性是对dotnetwebservice协议的支持,如果dotnet的webservice 不指定rpc方式则用true否则要用false
envelope.dotNet = true;
//envelope.setOutputSoapObject(request);//设置请求参数
envelope.bodyOut=request; //enveloper.bodyOut=request 与 envelope.setOutputSoapObject(request) 效果相同。
//step4 创建HttpTransportSE对象
HttpTransportSE ht = new HttpTransportSE(URL);
//step5 调用WebService
ht.call(SOAP_ACTION, envelope); //关键的一步,很多问题都在这一步调试时出现问题。要么是IIS有问题,要么是ksoap2相关参数没配置好。
if(envelope.getResponse()!=null){
SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
String result =response.toString() ;
if (result != null)
{
tv.setText(result);
}
else
{
tv.setText("登录失败!");
}
}
else {
tv.setText("服务器可能没有开启!");
}
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
tv.setText("异常了,原因:" + e.getMessage());
}
}
}
}
备注:客户端访问WEB服务是网上参考的,执行到: ht.call(SOAP_ACTION, envelope); 转入catch,,而且e.getMessage()获取的值为null
初学android开发,谢谢大家帮忙。 --------------------编程问答-------------------- <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
也加了访问权限了。 --------------------编程问答-------------------- 别光看e.getMessage()这个消息
这个消息报null的时候情况比较多
建议看看e这个错误对象,看一下每个属性,里面还有有用的信息。 --------------------编程问答-------------------- 最近我也遇到了差不多的问题,想试试调用.net的webservice的接口,和你的代码基本差不多,
我的问题是导入不同的ksoap2 jar包 报的错还不一样。。。
要是楼主先解决了 通知一声啊 --------------------编程问答-------------------- 看了下ksoap2的官网,说现在只支持java1.3不知道是不是这个问题,我是java1.7说啥也调不出来 --------------------编程问答-------------------- 我搞定了,安卓4.0以后,主线程不能访问网络,你再开个线程调webservice就好使了
补充:移动开发 , Android