android通过ksoap2调用c#语言写的部署在iis上的webservice

第一步 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的方法,没有返回值,具体原因不太知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值