WCF服务端与使用HttpClient的Android客户端简单示例
2015-10-13 16:02
483 查看
WCF服务端
Contract
using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; using System.Web; namespace Contract { /// <summary> /// 服务接口 /// </summary> /// <remarks> /// WebInvoke - 指示服务操作在逻辑上就是调用操作,而且可由Web编程模型调用 /// WebGet - 指示服务操作在逻辑上就是检索操作,而且可由Web编程模型调用 /// UriTemplate - 用于服务操作的统一资源标识符(URI)模版。URI模版可以将一个URI或一组URI映射到服务操作 /// Method - 与操作关联的写作方法,默认为 POST /// ResponseFormat - 指定从服务操作发出的响应的格式。Xml或Json /// BodyStyle - 指定body里面的封装 /// </remarks> [ServiceContract] public interface IWcfService { /// <summary> /// GET - 无参数 - 返回值为字符串数组 /// </summary> /// <returns></returns> [OperationContract] [WebGet( ResponseFormat = WebMessageFormat.Json)] List<string> GetStudentNames(); /// <summary> /// GET - 无参数 - 返回值为自定义类型的数组 /// </summary> /// <returns></returns> [OperationContract] [WebGet( ResponseFormat = WebMessageFormat.Json)] List<Student> GetStudents(); /// <summary> /// GET - 一个参数 - 返回值为int /// </summary> /// <param name="name"></param> /// <returns></returns> [OperationContract] [WebGet( UriTemplate = "GetStudentAge/{name}", //UriTemplate = "GetStudentAge?name={name}", //默认形式 ResponseFormat = WebMessageFormat.Json)] int GetStudentAge(string name); /// <summary> /// GET - 多个参数 - 返回值为自定义格式 /// </summary> /// <param name="name"></param> /// <param name="birth"></param> /// <param name="age"></param> /// <returns></returns> [OperationContract] [WebGet( UriTemplate = "CreateStudent/{name}/{birth}/{age}", //UriTemplate中只允许字符串类型的变量 //UriTemplate = "CreateStudent?name={name}&birth={birth}&age={age}", //默认形式 ResponseFormat = WebMessageFormat.Json)] Student CreateStudent(string name, string birth, string age); /// <summary> /// POST - 一个参数 - 返回值为bool /// </summary> /// <param name="name"></param> /// <returns></returns> [OperationContract] [WebInvoke( UriTemplate = "DeleteStudent", Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] bool DeleteStudent(string name); /// <summary> /// POST - 多个参数 - 返回值为自定义格式 /// </summary> /// <param name="name"></param> /// <param name="birth"></param> /// <param name="age"></param> /// <returns></returns> [OperationContract] [WebInvoke( UriTemplate = "AddStudent", Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] Student AddStudent(string name, string birth, int age); /// <summary> /// POST - 自定义格式参数 - 返回值为string /// </summary> /// <param name="student"></param> /// <returns></returns> [OperationContract] [WebInvoke( UriTemplate = "UpdateStudent", Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] string UpdateStudent(Student student); } [DataContract] public class Student { private string name; [DataMember(Order = 0, Name = "name")] public string Name { get { return name; } set { name = HttpUtility.UrlDecode(value, Encoding.UTF8); } } private string birth; [DataMember(Order = 1, Name = "birth")] public string Birth { get { return birth; } set { this.birth = value; } } private int age; [DataMember(Order = 1, Name = "age")] public int Age { get { return age; } set { this.age = value; } } } }
Service
using Contract; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Text; using System.Web; namespace Service { public class WcfService : IWcfService { public List<string> GetStudentNames() { Console.WriteLine(); Console.WriteLine("GetStudentNames()"); List<string> results = new List<string>(); results.Add("zhangsan"); results.Add("李四"); results.Add("wangwu"); return results; } public List<Student> GetStudents() { Console.WriteLine(); Console.WriteLine("GetStudents()"); List<Student> results = new List<Student>(); results.Add(new Student() { Name = "zhangsan", Birth = "1955-5-48", Age = 56 }); results.Add(new Student() { Name = "李四", Birth = "1965-6-48", Age = 46 }); return results; } public int GetStudentAge(string name) { Console.WriteLine(); Console.WriteLine("GetStudentAge(name)"); Console.WriteLine(); Console.WriteLine("name = " + name); return 22; } public Student CreateStudent(string name, string birth, string age) { Console.WriteLine(); Console.WriteLine("CreateStudent(name,birth,age)"); Console.WriteLine(); Console.WriteLine("name = " + name + ", birth = " + birth + ", age = " + age); return new Student() { Name = name, Birth = birth, Age = Convert.ToInt32(age) }; } public bool DeleteStudent(string name) { name = HttpUtility.UrlDecode(name, Encoding.UTF8); Console.WriteLine(); Console.WriteLine("DeleteStudent(name)"); Console.WriteLine(); Console.WriteLine("name = " + name); return true; } public Student AddStudent(string name, string birth, int age) { Console.WriteLine(); Console.WriteLine("AddStudent(name,birth,age)"); Console.WriteLine(); Console.WriteLine("name = " + name + ", birth = " + birth + ", age = " + age); return new Student() { Name = name, Birth = birth, Age = age }; } public string UpdateStudent(Student student) { Console.WriteLine(); Console.WriteLine("UpdateStudent(student)"); Console.WriteLine(); Console.WriteLine("name = " + student.Name + " , birth = " + student.Birth); return student.Name; } } }
Hosting
App.config<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> <behaviors> <endpointBehaviors> <behavior name="webHttpBehavior"> <webHttp helpEnabled="true"/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="webHttpBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="metadata"/> <serviceDebug includeExceptionDetailInFaults="true"/> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> </behavior> </serviceBehaviors> </behaviors> <bindings> <webHttpBinding> <binding name="webHttpBinding" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> </binding> </webHttpBinding> </bindings> <services> <service behaviorConfiguration="webHttpBehavior" name="Service.WcfService"> <endpoint address="/" behaviorConfiguration="webHttpBehavior" binding="webHttpBinding" bindingConfiguration="webHttpBinding" name="WcfService" contract="Contract.IWcfService" /> <host> <baseAddresses> <add baseAddress="http://localhost:8888/service" /> </baseAddresses> </host> </service> </services> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> <!--保存具体的错误信息到svclog文件中--> <system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true"> <listeners> <add name="xml" /> </listeners> </source> </sources> <sharedListeners> <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="F:\wcf.svclog" /> </sharedListeners> </system.diagnostics> </configuration>
Program.cs
using System; using System.ServiceModel; namespace Hosting { class Program { /// <summary> /// 采用自托管的方式发布服务 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Console.WriteLine("---------------------------------------------------------------"); ServiceHost host = null; try { host = new ServiceHost(typeof(Service.WcfService)); host.Opened += host_Opened; host.Open(); //公共服务地址 foreach (var endPoint in host.Description.Endpoints) { Console.WriteLine(endPoint.Address.ToString()); } Console.WriteLine("按任意键终止服务!"); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.Read(); if (host != null) { host.Close(); host = null; } } } static void host_Opened(object sender, EventArgs e) { Console.WriteLine("Service已经启动"); } } }
Android客户端
HttpClientThread.java
import android.os.Handler; import android.widget.TextView; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.params.HttpClientParams; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONStringer; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class HttpClientThread extends Thread { private Handler handler; private TextView textView; private HttpParams httpParams; private HttpClient httpClient; public HttpClientThread(Handler handler, TextView textView) { this.handler = handler; this.textView = textView; this.httpClient = getHttpClient(); } @Override public void run() { String result = ""; String url = "http://192.168.0.192:8888/service/"; //GET,无参数,返回值为字符串数组 // result = doHttpClientGet(url + "GetStudentNames"); // try { // JSONArray array = new JSONArray(result); // result = ""; // for (int i=0; i<array.length(); i++) { // String str = array.getString(i); // result += str + "\n"; // } // } catch (JSONException e) { // e.printStackTrace(); // } //GET,无参数,返回值为自定义类型的数组 // result = doHttpClientGet(url + "GetStudents"); // result = parseStudentArray(result); //GET,一个参数,返回值为整型 // result = doHttpClientGet(url + "GetStudentAge/张三"); // result = doHttpClientGet(url + "GetStudentAge?name=张三");//根据服务端的UriTemplate确定 //GET,多个参数,返回值为自定义格式 // result = doHttpClientGet(url + "CreateStudent/张三/1982-12-13/23"); // result = parseStudent(result); //POST,一个参数,返回值为布尔值 // JSONStringer jsonStringer = null; // try { // jsonStringer = new JSONStringer() // .object() // .key("name").value(URLEncoder.encode("张三", "utf-8")) // .endObject(); // result = doHttpClientPost(url + "DeleteStudent", jsonStringer); // } catch (JSONException e) { // e.printStackTrace(); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } //POST,多个参数,返回值为自定义类型 // try { // JSONStringer jsonStringer = new JSONStringer() // .object() // .key("name").value("zhangsan") // .key("birth").value("1923-12-34") // .key("age").value(89) // .endObject(); // result = doHttpClientPost(url + "AddStudent", jsonStringer); // result = parseStudent(result); // } catch (JSONException e) { // e.printStackTrace(); // } //POST,自定义格式参数,返回值为字符串类型 try { JSONStringer jsonStringer = new JSONStringer() .object() .key("student") .object() .key("name").value("lisi") .key("birth").value("2010-4-30") .endObject() .endObject(); result = doHttpClientPost(url + "UpdateStudent", jsonStringer); } catch (JSONException e) { e.printStackTrace(); } //显示结果 final String finalResult = result; handler.post(new Runnable() { @Override public void run() { textView.setText(finalResult); } }); } private String doHttpClientPost(String url, JSONStringer jsonStringer) { // HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); try { if (jsonStringer != null) { httpPost.setEntity(new StringEntity(jsonStringer.toString())); } HttpResponse httpResponse = httpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String result = EntityUtils.toString(httpResponse.getEntity()); return result; } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } private String doHttpClientGet(String url) { // HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); try { HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String result = EntityUtils.toString(httpResponse.getEntity()); return result; } } catch (IOException e) { e.printStackTrace(); } return ""; } private HttpClient getHttpClient() { httpParams = new BasicHttpParams(); //可不配置 //设置连接超时、Socket超时、Socket缓存大小 HttpConnectionParams.setConnectionTimeout(httpParams, 20*1000); HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000); HttpConnectionParams.setSocketBufferSize(httpParams, 8192); //设置重定向,缺省为true HttpClientParams.setRedirecting(httpParams, true); //设置用户代理 String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6"; HttpProtocolParams.setUserAgent(httpParams, userAgent); httpClient = new DefaultHttpClient(httpParams); return httpClient; } /** * 解析json字符串为json对象,将json对象转化为student * @param json * @return */ private String parseStudent(String json) { String result = ""; try { JSONObject object = new JSONObject(json); Student student = new Student(); student.setName(object.getString("name")); student.setBirth(object.getString("birth")); student.setAge(object.getInt("age")); result = student.toString(); } catch (JSONException e) { e.printStackTrace(); } return result; } /** * 解析json字符串为json数组,将json对象转化为Student * @param json * @return */ private String parseStudentArray(String json) { String result = ""; try { JSONArray jsonArray = new JSONArray(json); for (int i=0; i<jsonArray.length(); i++) { JSONObject object = jsonArray.getJSONObject(i); Student student = new Student(); student.setName(object.getString("name")); student.setBirth(object.getString("birth")); student.setAge(object.getInt("age")); result += student.toString() + "\n"; } } catch (JSONException e) { e.printStackTrace(); } return result; } public class Student { private String name; private String birth; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", birth=" + birth + ", age=" + age + "]"; } } }
MainActivity.java
import android.app.Activity; import android.os.Handler; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { private Handler handler = new Handler(); private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); new HttpClientThread(handler, textView).start(); } }
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
参考文档:
wcf完美搭建android平台服务之一
wcf完美搭建android平台服务之二
wcf完美搭建android平台服务之三
在Android调用WCF服务
相关文章推荐
- 浅谈TCP优化
- 首先,要申明一点,过去与现在,电影的字幕都不是问题。并且,网络如此自由,未来也不是问题。只是分享的平台不会一家独大,分享的途径方式也会多种多样。
- android http请求
- HttpMime 处理 多部件 POST 请求
- HttpMime 处理 多部件 POST 请求
- deeplearning系列(六)卷积神经网络
- DOS批处理笔记本连接WIFI和有线网络
- HttpClient请求服务器代码优化版
- HttpClient请求服务器代码优化版
- HttpClient 网络优化
- HttpClient 网络优化
- 关于 httpUrlConnection 的 setDoOutput 与 setDoInput
- Volley网络连接封装类
- vs中SQL Server建立连接时出现与网络相关的或特定的实例的错误。未找到或无法访问服务器
- 个人学习——网络:根据子网掩码计算子网数
- HttpClient多线程并发问题
- linux/unix系统下的网络配置
- TCP/IP网络编程 基于Linux编程_2 --I/O流分离的半关闭问题
- TCP/IP网络编程 基于Linux编程_2 --I/O流分离的半关闭问题
- 图解TCP/IP之概述