邙山之巅 承接网站建设 + 网站推广 + 网站优化 + IDC + 网络广告等业务。

本博客网页模板,经过SEO优化和测试, 保证其 完整性 + 无错性 + 美观性 + 最简性 !
完整性 -头部尾部完整,首页,列表,内容完整.无错性 -整站模板安装即可使用,Js无错误,兼容IE6,IE7,ie8,FF
美观性 -整体协调,美观大方,配色合理.最简性 -采取DIV+CSS布局,整站无垃圾代码,架构合理,减少下载时间,节省带宽

Android访问WCF服务

时间:2011-12-27 23:31来源: 作者:admin 点击:
服务的开发流程我们按照 服务契约(ServiceContract), 服务实现(Service), 实体对象模型(Model) 及服务发布的流程来介绍.
由于自己对Http请求的链接认识的比较浅,对于有些问题没法做出清楚明了的解释, Android访问WCF这篇文章我会贴出来代码, 让后说明一下关注的地方, 不做深入研究.
一. 服务契约(Contract)view plain
1.        [ServiceContract]   
2.            public interface IAccountJsonService   
3.              
4.                [OperationContract(Name = "GetAccountDataJson")]   
5.                [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetAccountData", BodyStyle = WebMessageBodyStyle.Bare)]   
6.                List<Account> GetAccountData();   
7.           
8.                [OperationContract(Name = "SendMessageJson")]   
9.                [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "SendMessage/{Message}", BodyStyle = WebMessageBodyStyle.Bare)]   
10.                string SendMessage(string Message);   
11.             


此契约定义了两个方法, GetAccountData(获取Account数据列表, 方法不带参数), SendMessage, 获取从客户端传过来的数据, 并返回; 
1. 这里面注意WebInvoke(SendMessage方法)这个Attribute, Method代表了Http的访问方法, 我们这是从服务器获取数据,是请求数据, 所以用GET, 这个也可以用另外一个Attribute来替代-WebGet(GetAccountData方法); 
2. 我们要给客户端返回Json数据,我们只需在WebInvoke or WebGet Attribute中指定ResponseFormat的格式即可, 这个从名字命名就可以看出来是制定返回的数据格式的.
3. 要注意UriTemplate属性, 这个是指定我们请求时的方法路径, 后面给出示例.
二. 服务实现(Service)view plain
1.        public class AccountService : IAccountJsonService   
2.          
3.            public List<Account> GetAccountData()   
4.              
5.                return MockAccount.AccountList;   
6.              
7.            public string SendMessage(string Message)   
8.              
9.                return " Message:" + Message;   
10.              
11.         


此处只是实现了IAccountJsonService接口.
三. 实体对象模型&模拟数据实体类定义:view plain
1.        [DataContract]   
2.            public class Account   
3.              
4.                [DataMember]   
5.                public string Name { get; set; }   
6.                [DataMember]   
7.                public int Age { get; set; }   
8.                [DataMember]   
9.                public string Address { get; set; }   
10.                [DataMember]   
11.                public DateTime Birthday { get; set; }   
12.             


模拟数据:
view plain
1.        public class MockAccount   
2.             
3.               public static List<Account> AccountList   
4.                 
5.                   get   
6.                    
7.                       var list = new List<Account>();   
8.                       list.Add(new Account { Name = "Bill Gates", Address = "YouYi East Road", Age = 56, Birthday = DateTime.Now });   
9.                       list.Add(new Account { Name = "Steve Paul Jobs", Address = "YouYi West Road", Age = 57, Birthday = DateTime.Now });   
10.                       list.Add(new Account { Name = "John D. Rockefeller", Address = "YouYi North Road", Age = 65, Birthday = DateTime.Now });   
11.                       return list;   
12.                    
13.                 
14.            


模拟数据返回一个Account的列表, 含有三条模拟数据, Birthday用DateTime.Now可是随时查看数据是不是最新生成的.

四. 服务发布
在这个例子里面, 我们的服务采用Console的发布形式, 如果采用IIS发布, 只要参考WCF的服务配置信息, 在IIS环境下配置就OK了.
WCF配置信息
view plain
1.        <system.serviceModel>   
2.          <behaviors>   
3.            <serviceBehaviors>   
4.              <behavior name="">   
5.                <serviceMetadata httpGetUrl="mex" httpGetEnabled="true"/>   
6.                <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>   
7.              </behavior>   
8.            </serviceBehaviors>   
9.            <endpointBehaviors>   
10.              <behavior name="WebHttpBindingBehavior">   
11.                <webHttp/>   
12.              </behavior>   
13.            </endpointBehaviors>   
14.          </behaviors>   
15.           
16.          <services>   
17.            <service name="Hosting.AccountService">   
18.              <endpoint address="xml" binding="webHttpBinding"  contract="Hosting.IAccountXmlService" behaviorConfiguration="WebHttpBindingBehavior"/>   
19.              <!--<endpoint address="json" binding="webHttpBinding"  contract="Hosting.IAccountJsonService" behaviorConfiguration="WebHttpBindingBehavior"/>-->   
20.              <host>   
21.                <baseAddresses>   
22.                  <add baseAddress="http://127.0.0.1:82/AccountService"/>   
23.                </baseAddresses>   
24.              </host>   
25.            </service>   
26.          </services>   
27.        </system.serviceModel>  


控制台进行服务的托管发布

view plain
1.        class Program   
2.             
3.               static void Main(string[] args)   
4.                 
5.                   using (ServiceHost host = new ServiceHost(typeof(AccountService)))   
6.                    
7.                       host.Open();   
8.                       Console.WriteLine("AccountService Address:");   
9.                       foreach (var endpoint in host.Description.Endpoints)   
10.                         
11.                           Console.WriteLine(endpoint.Address.ToString());   
12.                         
13.                       Console.WriteLine("AccountService Started,Press any key to stop service...");   
14.                       Console.ReadKey();   
15.                       host.Close();   
16.                    
17.                 
18.            



本章目的: 实现在Android客户端请求我们上篇建立的WCF数据服务.
此部分分为 建立Http请求 跟 接受WCF 返回的数据.
一. 建立Http请求的方法
view plain
1.        protected String getRequest(String url, DefaultHttpClient client)   
2.                    throws Exception {   
3.                String result = null;   
4.                int statusCode = 0;   
5.                HttpGet getMethod = new HttpGet(url);   
6.                Log.d(TAG, "do the getRequest,url=" + url + "");   
7.                try {   
8.                    getMethod.setHeader("User-Agent", USER_AGENT);   
9.                    // HttpParams params = new HttpParams();   
10.           
11.                    // 添加用户密码验证信息   
12.                    // client.getCredentialsProvider().setCredentials(   
13.                    // new AuthScope(null, -1),   
14.                    // new UsernamePasswordCredentials(mUsername, mPassword));   
15.           
16.                    HttpResponse httpResponse = client.execute(getMethod);   
17.                    // statusCode == 200 正常   
18.                    statusCode = httpResponse.getStatusLine().getStatusCode();   
19.                    Log.d(TAG, "statuscode = " + statusCode);   
20.                    // 处理返回的httpResponse信息   
21.                    result = retrieveInputStream(httpResponse.getEntity());   
22.                } catch (Exception e) {   
23.                    Log.e(TAG, e.getMessage());   
24.                    throw new Exception(e);   
25.                } finally {   
26.                    getMethod.abort();   
27.                 
28.                return result;   
29.             


参数URL: 我们要请求的地址
Client:  这个可以直接用new DefaultHttpClient(new BasicHttpParams()) 来初始化.
这个方法中需要注意RetrieveInputStream方法, 这个是当Http请求完成之后, 用来处理服务器返回数据的方法, 

二. 接受从WCF端传回的数据
view plain
1.        protected  String retrieveInputStream(HttpEntity httpEntity) {   
2.                int  length = (int) httpEntity.getContentLength();   
3.                if  (length < 0)   
4.                    length = 10000;   
5.                StringBuffer stringBuffer = new  StringBuffer(length);   
6.                try    
7.                    InputStreamReader inputStreamReader = new  InputStreamReader(   
8.                            httpEntity.getContent(), HTTP.UTF_8);   
9.                    char  buffer[] = new char[length];   
10.                    int  count;   
11.                    while  ((count = inputStreamReader.read(buffer, 0, length - 1)) > 0) {   
12.                        stringBuffer.append(buffer, 0, count);   
13.                      
14.                } catch  (UnsupportedEncodingException e) {   
15.                    Log.e(TAG, e.getMessage());   
16.                } catch  (IllegalStateException e) {   
17.                    Log.e(TAG, e.getMessage());   
18.                } catch  (IOException e) {   
19.                    Log.e(TAG, e.getMessage());   
20.                 
21.                return  stringBuffer.toString();   
22.             


此方法在接受到WCF服务端返回的数据之后,  转换程String类型返回.
附加内容:
view plain
1.        private static final String BASE_URL = "http://10.0.2.2:82/BlogCategoryService/";   
2.        private static final String EXTENSION = "Json/";;   
3.        private static final String TAG = "API";   
4.        private static final String USER_AGENT = "Mozilla/4.5";   
5.           
6.        public JSONObject getObject(String sbj) throws JSONException, Exception {   
7.            return new JSONObject(getRequest(BASE_URL + EXTENSION + sbj));   
8.          
9.           
10.        public JSONArray getArray(String sbj) throws JSONException,   
11.                Exception {   
12.            return new JSONArray(getRequest(BASE_URL + EXTENSION + sbj));   
13.          
14.           
15.        protected String getRequest(String url) throws Exception {   
16.            return getRequest(url, new DefaultHttpClient(new BasicHttpParams()));   
17.         


请求数据之前封装方法:

总结 : 此篇主要说明了Http请求的的两个阶段, 建立请求跟接受服务器返回的数据, 在下篇再主要说明如何处理服务端返回的JSON数据,并把数据显示在UI上面.
(责任编辑:admin)
首页 - 技术交流 - 生活感悟 - 影视音乐 - 网址导航 - 图片收藏 - 实用工具 - 网站地图 - 百度地图 - RSS地图
邙山之巅:软件攻城师,互联网砖家,山水田园诗人,著名的思想家,政治家,文学家。
是中华人民共和国合法公民,在计算机软件方面有较高造诣。著有《放羊的那些事》一书,书中描绘了自己童年时代放羊的美好时光,
告诫人们要保护环境,否则以后只能在上海的南京路上放羊了。同时脑细胞异常活跃,经常胡思乱想,目前正在思考如何解决“欧债危机”和“美债危机”这两个世界级难题。
邙山之巅:从小就饱读诗书,学前班连上五年,破世界吉尼斯纪录,因此基础知识功底非常深厚。7岁能够看懂A片,8岁可以腾云吐雾,9岁号称千杯不倒,10岁已然有了一次轰轰烈烈的恋爱。此时此刻,很多东西对他来说早已是风轻云淡。后来考取了美国法克由大学的全能博士学位,成为华人中获得此高等学位的第一人。
在计算机方面的成就:精通C,C++,C#,JAVA,PHP,ASP,VB,DELPHI,ORACLE,MYSQL等。尤其精通网页前后台,设计,DIV+CSS,PHP+MYSQL,js,以及各种流行CMS。
新公司堆积3个月的活,被其一周干完。曾因技术过强,工作效率过高,而遭人嫉妒。 政治学方面成就:成功收复台湾,维护了台海稳定。
经济学方面的成就:帮助世界各国成功度过经济危机,并且成功预测了后经济危机时代的到来。 文学方面的成就:著《放羊的那些事》,以及10篇评论性文章,均未发表或出版。
Copyright ◎ 2012-2022 lixinwei.cn 邙山之巅 版权所有
豫ICP备17045676号-1 给我写信