Android客户端调用Asp.net的WebService

我来说两句 |2011-11-23 13:39:15

在Android端为了与服务器端进行通信有几种方法:1、Socket通信2、WCF通信3、WebService通信。因为ASP.net中发布WebService非常简单,所以我们选择用WebService来进行通信。在Android端调用.Net的WebService又有两种方法:1、开源的ksoap-2类库进行soap通信2、通过Http请求来调用,我们选择第二种方法,简单快捷。

首先,先准备服务器端,在web.config里面的的system.Web节点添加

<webServices>

<protocols>

<add name= "HttpPost"/>

<add name= "HttpGet"/>

</protocols>

</webServices>

否则通过“WsUrl/方法”的路径访问WebService时会出现“因URL 意外地以“/方法名”结束,请求格式无法识别。执行当前Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 ”的错误。在IIS中部署网站,分配“8082”端口给该网站,然后在Windows防火墙的“高级设置”中添加“入站规则”,将“8082”端口添加访问权限到入站规则中,如果不添加入站规则,则在打开windows防火墙的情况下局域网内的客户端是不能够通过"http://192.168.1.122:8082"访问到该网站的,会显示“无法打开网页”的错误,因此更不可能通过“http://192.168.1.122:8082/WebServices/TestService.asmx/GetUserList”访问到WebMethod。新建一个名为TestService.asmx的WebService,并在TestService.asmx中新建两个方法,一个带参数,一个不带参数,如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

//using System.Web.Script.Services;//[ScriptMethod(ResponseFormat=ResponseFormat.Json)]所需引用的命名空间

using BLL;

using Model;

namespace Test.WebServices

{

/// <summary>

/// TestService的摘要说明

/// </summary>

[WebService(Namespace = "http://www.testservice.com/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

[System.ComponentModel.ToolboxItem(false)]

// 若要允许使用ASP.NET AJAX 从脚本中调用此Web 服务,请取消对下行的注释。

[System.Web.Script.Services.ScriptService]//这个属性必须把注释取消掉

public class TestService: System.Web.Services.WebService

{

[WebMethod]

//[ScriptMethod(ResponseFormat=ResponseFormat.Json)]

public string HelloWorld()

{

return "Hello World";

}

[WebMethod]

// [ScriptMethod(ResponseFormat = ResponseFormat.Json)]//不需要该属性,Android端设置Http头的Content-Type为application/json即可返回JSON数据格式给客户端

public List<ModelUser> GetUserList()

{

BLLUser bllUser = new BLLUser();

return bllUser.GetModelList();

}

[WebMethod]

//[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

public ModelUser GetUserByUserName(string strUserName)

{

BLLUser bllUser = new BLLUser();

return bllUser.GetModel(strUserName);

}

}

public class ModelUser

{

public string UserName{get;set;};

public string Password{get;set;};

}

}

www.2cto.com

ASP.net服务器端的的代码准备好之后开始编写Android客户端的代码,如下:

package com.wac.Android.TestService;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.protocol.HTTP;

import org.apache.http.util.EntityUtils;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.TextView;

import android.widget.Button;

public class TestServiceActivity extends Activity {

private static final String TAG = "TestService";

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

OnClickListener listener = new OnClickListener() {

public void onClick(View v) {

try {

//1、调用不带参数的WebMethod

final String SERVER_URL = "http://192.168.1.122:8082/WebServices/TestService.asmx/GetUserList";

HttpPost request = new HttpPost(SERVER_URL); // 根据内容来源地址创建一个Http请求

request.addHeader("Content-Type", "application/json; charset=utf-8");//必须要添加该Http头才能调用WebMethod时返回JSON数据

HttpResponse httpResponse = new DefaultHttpClient().execute(request); // 发送请求并获取反馈

// 解析返回的内容

if (httpResponse.getStatusLine().getStatusCode() !=404) //StatusCode为200表示与服务端连接成功,404为连接不成功

{

//因为GetUserList返回的是List<ModelUser>,所以该数据的JSON格式为:

//{"d":[{"__type":"Model.ModelUser","UserName":"wa1","Password":"123"},{"__type":"Model.ModelUser","UserName":"wa2","Password":"123"}]}

String result = EntityUtils.toString(httpResponse.getEntity());

Log.i("result",result);// System.out.println(result);

JSONArray resultArray=new JSONObject(result).getJSONArray("d"); //获取ModelUser类型的JSON对象数组

TextView tv=(TextView)findViewById(R.string.textview1);

tv.setText(((JSONObject)resultArray.get(0)).getString("UserName").toString()); //获取resultArray第0个元素中的“UserName”属性

}

/*

//2、调用带参数的WebMethod

final String SERVER_URL = "http://192.168.1.122:8082/WebServices/TestService.asmx/GetUserByUserName"; // 带参数的WebMethod

HttpPost request = new HttpPost(SERVER_URL); // 根据内容来源地址创建一个Http请求

request.addHeader("Content-Type", "application/json; charset=utf-8");//必须要添加该Http头才能调用WebMethod时返回JSON数据

JSONObject jsonParams=new JSONObject();

jsonParams.put("strUserName", "wa1");//传参,如果想传递两个参数则继续添加第二个参数jsonParams.put("param2Name","param2Value")

HttpEntity bodyEntity =new StringEntity(jsonParams.toString(), "utf8");//参数必须也得是JSON数据格式的字符串才能传递到服务器端,否则会出现"{'Message':'strUserName是无效的JSON基元'}"的错误

request.setEntity(bodyEntity);

HttpResponse httpResponse = new DefaultHttpClient().execute(request); // 发送请求并获取反馈

// 解析返回的内容

if (httpResponse.getStatusLine().getStatusCode() !=404) //StatusCode为200表示与服务端连接成功,404为连接不成功

{

//因为GetUserByUserName返回的是ModelUser,所以该数据的JSON格式为:

//{"d":{"__type":"Model.ModelUser","UserName":"wa1","Password":"123"}}

String result = EntityUtils.toString(httpResponse.getEntity());

Log.i("result",result);

JSONObject resultJSON=new JSONObject(result).getJSONObject("d");//获取ModelUser类型的JSON对象

TextView tv=(TextView)findViewById(R.string.textview1);

tv.setText(resultJSON.getString("UserName").toString());

Log.i("resultJSON",resultJSON);

}

*/

} catch (Exception e) {}

}};

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(listener);

}

}

至此,客户端访问服务端的代码已经完成。

摘自 呼噜Zz~的专栏

Android客户端调用Asp.net的WebService的更多相关文章

  1. .net 客户端调用java或.net webservice进行soapheader验证

    .net 客户端调用java或.net webservice进行soapheader验证 最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservi ...

  2. 在Android中调用C#写的WebService(附源代码)

    由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章.在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebServi ...

  3. 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决

    ksoap2-android-3.0.0-jar 第三方库来调用.net 写的Web Service 如果没有参数,那么调用一切顺利,但是如果服务是带参数的,那么服务端接收的参数都是nul.      ...

  4. Java调用ASP.NET的webservice故障排除

    公司要接入其它公司的一个业务功能,对方是提供的 .net产生的webservice,在用cxf的wsdl2java命令生成客户端的测试代码时,出现了如下故障WSDLToJava Error: Thro ...

  5. 在Android中调用KSOAP2库访问webservice服务出现的服务端返回AnyType{}

    最近在做毕业设计的时候,涉及到了安卓端访问web service服务端数据库,并返回一个值,当我把web service测试通过后,想写一个简单的安卓测试程序,来实现服务端数据库访问,通过web se ...

  6. Android调用基于.net的WebService

    在实际开发项目中,有时候会为Android开发团队提供一些接口,一般是以asmx文件的方式来承载.而公布出去的数据一般上都是标准的json数据.但是在实际过程中,发现Android团队那边并不是通过将 ...

  7. webservice -- cxf客户端调用axis2服务端

    背景: 有个项目, 需要由第三方提供用户信息, 实现用户同步操作, 对方给提供webservice接口(axis2实现)并也使用axis2作主客户端调用我方提供的webservice接口 起初, 由于 ...

  8. [PHP]AES加密----PHP服务端和Android客户端

    本文采取128位AES-CBC模式加密和解密 1.首先对服务端安装mcrypt: sudo apt-get install php5-mcrypt php5-dev sudo php5enmod mc ...

  9. Android Studio 2.3.3 调用asp.net webService实战(拒绝忽悠)

    1.路径中不能包含localhost(本来想在本机调试,就是不行,没办法发布到远程服务器) 2.必须采用异步的办法(阻塞主线程的是肯定不行了) 3.以下是全部的源代码(毫不保留) package co ...

随机推荐

  1. dispatchkeyevent的调用机制

    http://blog.csdn.net/look85/article/details/23740761 dispatchKeyEvent和onKeyDown关系: 当键盘按下时 首先触发dispat ...

  2. C# Ref 与out 的区别

    在C#中,有四种传递参数方式: 1. 传值 (value) : 无额外修饰符 2. 传址(reference) : 需修饰符Ref,传入函数的参数必须先赋值 3. 输出参数(output): 需修饰符 ...

  3. xcode7启动页的尺寸设置

    iPhone Portrait iOS 8,9-Retina HD 5.5 (1242×2208) @3x iPhone Portrait iOS 8,9-Retina HD 4.7 (750×133 ...

  4. Pintos-斯坦福大学操作系统Project详解-Project1

    转载请注明出处. 前言:  本实验来自斯坦福大学cs140课程,只限于教学用途,以下是他们对于Pintos系统的介绍:  Pintos is a simple operating system fra ...

  5. 理解ThreadLocal背后的概念

    介绍 我之前在任何场合都没有使用过thread local,因此没有注意到它,直到最近用到它的时候. 前提信息 线程可以理解为一个单独的进程,它有自己的调用栈.在java中每一个线程都有一个调用栈或者 ...

  6. 插入标记 方法 insertAdjacentHTML

    html5新增的插入标记方法,insertAdjacentHTML() 可以接受2个参数 插入位置和要插入的 HTML 文本.第一个参数必须是下列值之一: "beforebegin" ...

  7. 网站开发常用jQuery插件总结(四)验证插件validation

    在网站开发过程中,有时我们需要验证用户输入的信息是否符合我们的要求,所以我们会对用户提交的数据进行验证.验证分两次进行,一次是在客户端,一次是在服务端.客户端的验证可以提升用户的体验. jquery验 ...

  8. 搭建laravel5全面教学,爬坑(windows下)。

    1.首先下载屌比的Composer 2.然后下载composer.phar 3.然后下载最新版Laravel框架 4.将下载下来的laravel压缩包扔到htdocs目录下(扔到别的目录没试过) 5. ...

  9. 【python】原始字符创

    原始字符串语法在字符串前加"r" 如 tem=r"h\c\d\n"print(tem) 结果:h\c\d\n 注意:字符串结尾不能是\,否则报错,应对措施将\单 ...

  10. Centos + nginx + JBOSS AS 7 搭建Java web application

    最近做了一个Java的web app,一直想在Centos环境中搭建一个完整的web服务器,现在开始动手. 先说说环境: 操作系统: Centos 6.3 WEB服务器: nginx-1.2.5 Ap ...