第一步 IIS的搭建
首先打开控制面板 --> 程序–>启用或关闭Windows功能
全部勾选,然后点击确定,等待一会
然后点击开始菜单 --> Windows管理工具 --> Internet Infomation Services
第二步 用c#写webservice服务
我用的是vs2015
首先打开vs2015 -->File --> new -->project
选择web --> Asp.NET web 应用程序
如果你的vs2015中没有上面的Asp.NET web 应用程序选项,那么推荐你重新安装(重新打开安装程序 --> 修改 --> 如图全部勾选后 --> 下一步 --> 更新 等待一段时间就可以了) 。 如果你不想重新安装可以自己百度解决问题。
接着上面的新建项目步骤,给工程新建名字,名字随便,此处为WebService,然后点击确定。然后如下图所示,选择Empty,然后点击确定。
如果跳出下面页面,点击取消cancel。这个页面是做什么用的,因为我是初学,所以我也不太知道。
然后右击WebService这个项目 --> 添加 --> 新建项
选择 Web服务(ASMX) ,名称随便 ,此处为WebDemo ,然后点击添加。
然后项目就自动完成了如下代码
将方法稍微改写一下。如图所示。
然后右击WebService --> 选择发布
然后点击自定义
名称随便。然后确定
选择File System
继续下一页
点击发布,发布的路径记一下,后面要用到。
发布成功
第三步 将刚才写的webservice服务部署到IIS上
打开IIS -->右击网站 --> 选择添加网站
填写完后点击确定
然后右击Web --> 选择管理网站 --> 选择浏览
可能你直接就能成功打开下图页面,也可能出现错误,当出现错误时可以百度解决,我是参考下面的的网址解决问题的。
https://www.cnblogs.com/Brambling/p/6815565.html
当你解决了一个错误后,也许又会有新的错误出现,我也是用了很长时间才解决了所有错误。
当浏览成功后如下图所示:
点击服务说明
记住图中圈起来的内容,因为后面要用到。
第四步 android通过ksoap2调用webservice
首先要下载下面的ksoap2的jar包
相关网址:https://mvnrepository.com/
然后打开Android Studio软件:
File ->new -> New project
选择Empty Activity 然后next
Name自定义 ,api版本选择:API 28:Android 9.0(pie)。点击Finish完成
(1)首先在AndroidManifest.xml文件中添加如下代码。
android:networkSecurityConfig="@xml/network_security_config"
和
<uses-permission android:name="android.permission.INTERNET" />
如图所示:
可以看到添加完第一条语句后有错误,此时右击res --> New --> Directory
名字必须命名为xml
然后右击新建的xml文件夹 --> New --> File
此处要与上面AndroidManifest.xml中的对应,所以必须命名为network_security_config.xml
然后添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
如图所示:然后之前的错误就没有了。
(2)在activity_main.xml文件中添加如下代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/texta"
android:layout_width="200dp"
android:layout_height="50dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/textb"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="150dp"
android:text="测试"/>
<EditText
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="80dp"
/>
</RelativeLayout>
(3)在MainActivity中添加如下代码:
package cn.jun.kosap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
/*
*
* kosap项目是调用c#写的webservice方法
*
*
* */
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
public class MainActivity extends AppCompatActivity {
private EditText phoneSecEditText;
private TextView resultView;
private Button queryButton;
private String result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
phoneSecEditText = (EditText) findViewById(R.id.name);
resultView = (TextView) findViewById(R.id.texta);
queryButton = (Button) findViewById(R.id.textb);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = phoneSecEditText.getText().toString().trim();
// 判断是否有输入
if ("".equals(name)) {
// 给出错误提示
phoneSecEditText.setError("您输入的内容为空");
phoneSecEditText.requestFocus(); //把输入焦点放在此控件
// 将显示查询结果的TextView清空
resultView.setText("");
return;
}
//因为需要联网操作,android4.0版本后必须把联网操作放在子线程中,所以启动后台异步线程进行连接webService操作,并且根据返回结果在主线程中改变UI
QueryAddressTask queryAddressTask = new QueryAddressTask();
//启动后台任务
queryAddressTask.execute(name);
}
});
}
class QueryAddressTask extends AsyncTask<String, Integer, String> { //AsyncTask的作用是实现多线程、异步通信、消息传递
@Override
protected String doInBackground(String... params) { //接收输入参数,返回线程执行结果,系统自动调用
// 返回的信息是*/
try {
result = getRemoteInfo(params[0]);
} catch (Exception e) {
e.printStackTrace();
}
//将结果返回给onPostExecute方法
return result;
}
@Override
//此方法可以在主线程改变UI
protected void onPostExecute(String result) { //接收线程任务执行的结果
// 将WebService返回的结果显示在TextView中
resultView.setText(result);
}
}
public String getRemoteInfo(String name) throws Exception{
final String WSDL_URI = "http://ip:9005/WebDemo.asmx?WSDL"; //发布的WSDL 的URI 。此处ip是:你发布wsdl的电脑的ipv4地址,由于是使用自己电脑发布的,所以ip就是自己电脑的ipv4地址
String namespace = "http://tempuri.org/"; //targetNamespace名称空间
String methodName = "sayHello"; //要调用的方法名称
final String soapAction="http://tempuri.org/sayHello"; //soapAction
//以上值都可以从http:/ip:9050/webserviceDemo.asmx?WSDL页面中查看到
//第一步:实例化SoapObject 对象,指定webService的命名空间,以及调用方法名称
SoapObject request = new SoapObject(namespace, methodName);
//第二步:如果方法有参数的话,设置调用方法参数,如果没有参数就不用设置。此处没用到参数,所以用//注释
// request.addProperty("name", name); // request.addProperty("参数名称","参数值");
//第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11); //VER11表示soap的版本是soap11(之前在wsdl中看到的)
envelope.bodyOut = request; //由于是发送请求,所以是设置bodyOut
envelope.dotNet = true; // 如果是.net开发的webservice,这里要设置为true
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
httpTransportSE.call(soapAction, envelope); //调用
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
result = object.getProperty(0).toString();
return result;
}
}
下图中有错误,主要是因为刚才下载的ksoap2的jar包没有导入。
导入ksoap2包操作如图所示
将ksoap2包复制到libs文件夹下。
然后就没错误了。然后运行程序。
注意: 因为工程是android 9.0,所以你要在模拟器为android 9.0版本上运行程序。
随便输入几个字母。点击测试。
问题: 可能直接就能运行并得到结果“我是服务器调用的程序”。
也可能会出现问题,如图所示:点击下面的语句定位到错误。
此处的错误主要有两种原因:
第一种:可能是在(1)步有问题,因为Android 9.0系统已经默认不支持http请求了,谷歌默认要求链接是加密链接了,百度上有“android 9.0 http无法访问网络问题”的很多解决办法,自己百度。
第二种:可能是你的模拟器的移动网络和wifi关闭了
解决方法就是在模拟器中 设置 --> 网络和互联 --> 打开移动网络,或者wifi(注意: 模拟器的wifi有可能无法访问到互联网,所以你连的时候就会有时获取得到结果,有时获取不到)。所以推荐你只把模拟器的移动网络打开。
结果如下图所示:图中结果表示,调用了webservice服务的sayHello函数,并返回了“我是服务器调用的程序”
问题 就是将软件打包成apk,放到我自己的手机上运行时就会出现错误,调用不了webservice的方法,没有返回值,具体原因不太知道。