Android客户端调用Asp.net的WebService
我来说两句|2011-11-2313: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>
<addname="HttpPost"/>
<addname="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中新建两个方法,一个带参数,一个不带参数,如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Services;
//usingSystem.Web.Script.Services;//[ScriptMethod(ResponseFormat=ResponseFormat.Json)]所需引用的命名空间
usingBLL;
usingModel;
namespaceTest.WebServices
{
///<summary>
///TestService的摘要说明
///</summary>
[WebService(Namespace="http://www.testservice.com/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
//若要允许使用ASP.NETAJAX从脚本中调用此Web服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]//这个属性必须把注释取消掉
publicclassTestService:System.Web.Services.WebService
{
[WebMethod]
//[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
publicstringHelloWorld()
{
return"HelloWorld";
}
[WebMethod]
//[ScriptMethod(ResponseFormat=ResponseFormat.Json)]//不需要该属性,Android端设置Http头的Content-Type为application/json即可返回JSON数据格式给客户端
publicList<ModelUser>GetUserList()
{
BLLUserbllUser=newBLLUser();
returnbllUser.GetModelList();
}
[WebMethod]
//[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
publicModelUserGetUserByUserName(stringstrUserName)
{
BLLUserbllUser=newBLLUser();
returnbllUser.GetModel(strUserName);
}
}
publicclassModelUser
{
publicstringUserName{get;set;};
publicstringPassword{get;set;};
}
}
www.2cto.com
ASP.net服务器端的的代码准备好之后开始编写Android客户端的代码,如下:
packagecom.wac.Android.TestService;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpHost;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.entity.StringEntity;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.protocol.HTTP;
importorg.apache.http.util.EntityUtils;
importorg.json.JSONArray;
importorg.json.JSONException;
importorg.json.JSONObject;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.TextView;
importandroid.widget.Button;
publicclassTestServiceActivityextendsActivity{
privatestaticfinalStringTAG="TestService";
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
OnClickListenerlistener=newOnClickListener(){
publicvoidonClick(Viewv){
try{
//1、调用不带参数的WebMethod
finalStringSERVER_URL="http://192.168.1.122:8082/WebServices/TestService.asmx/GetUserList";
HttpPostrequest=newHttpPost(SERVER_URL);//根据内容来源地址创建一个Http请求
request.addHeader("Content-Type","application/json;charset=utf-8");//必须要添加该Http头才能调用WebMethod时返回JSON数据
HttpResponsehttpResponse=newDefaultHttpClient().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"}]}
Stringresult=EntityUtils.toString(httpResponse.getEntity());
Log.i("result",result);//System.out.println(result);
JSONArrayresultArray=newJSONObject(result).getJSONArray("d");//获取ModelUser类型的JSON对象数组
TextViewtv=(TextView)findViewById(R.string.textview1);
tv.setText(((JSONObject)resultArray.get(0)).getString("UserName").toString());//获取resultArray第0个元素中的“UserName”属性
}
/*
//2、调用带参数的WebMethod
finalStringSERVER_URL="http://192.168.1.122:8082/WebServices/TestService.asmx/GetUserByUserName";//带参数的WebMethod
HttpPostrequest=newHttpPost(SERVER_URL);//根据内容来源地址创建一个Http请求
request.addHeader("Content-Type","application/json;charset=utf-8");//必须要添加该Http头才能调用WebMethod时返回JSON数据
JSONObjectjsonParams=newJSONObject();
jsonParams.put("strUserName","wa1");//传参,如果想传递两个参数则继续添加第二个参数jsonParams.put("param2Name","param2Value")
HttpEntitybodyEntity=newStringEntity(jsonParams.toString(),"utf8");//参数必须也得是JSON数据格式的字符串才能传递到服务器端,否则会出现"{'Message':'strUserName是无效的JSON基元'}"的错误
request.setEntity(bodyEntity);
HttpResponsehttpResponse=newDefaultHttpClient().execute(request);//发送请求并获取反馈
//解析返回的内容
if(httpResponse.getStatusLine().getStatusCode()!=404)//StatusCode为200表示与服务端连接成功,404为连接不成功
{
//因为GetUserByUserName返回的是ModelUser,所以该数据的JSON格式为:
//{"d":{"__type":"Model.ModelUser","UserName":"wa1","Password":"123"}}
Stringresult=EntityUtils.toString(httpResponse.getEntity());
Log.i("result",result);
JSONObjectresultJSON=newJSONObject(result).getJSONObject("d");//获取ModelUser类型的JSON对象
TextViewtv=(TextView)findViewById(R.string.textview1);
tv.setText(resultJSON.getString("UserName").toString());
Log.i("resultJSON",resultJSON);
}
*/
}catch(Exceptione){}
}};
Buttonbutton=(Button)findViewById(R.id.button1);
button.setOnClickListener(listener);
}
}
至此,客户端访问服务端的代码已经完成。
摘自呼噜Zz~的专栏

更多相关文章

  1. 谈谈Android的三种网络通信方式
  2. Android中调用jni报错
  3. 【Android】handler+message的简单用法
  4. 关于Android中自定义ClassLoader耗时问题的追查
  5. Android(安卓)OkHttp3简介和使用详解
  6. Android(安卓)View中getViewTreeObserver().addOnGlobalLayoutLi
  7. Android(安卓)AIDL浅析及异步调用
  8. Android(安卓)8.0 dexopt记录
  9. Android中getView与inflate方法的详解

随机推荐

  1. android mediaplayer 播放 视频 【转】
  2. Android Handler机制 - handleMessage究
  3. KJFrameForAndroid
  4. Android软件如何自动升级
  5. Android自定义属性时TypedArray的使用方
  6. 使用Docker编译Android系统内核
  7. Android之消息推送实现
  8. Android WebView与JS交互全面详解
  9. Android(安卓)Jetpack架构组件(七)之Work
  10. android平台下音频编码之编译LAME库转码P