原文 Visual Studio中使用PCL项目加入WCF WebService参考
APP在应用时经常会用到WebService服务,在Xamarin中若同时要让iOS与Android叫用WebService时, 除了分别在iOS与Android中叫用WebService外, 还可以使用PCL项目(portable library class,中文叫可携式类别库), 并使用VisualStudio中的加入服务参考的方式快速度建立出WebService服务。
假设我们现有一个WCF Service服务,小小修改了一下预设提供的方法如下程序代码:
public string GetData(int value)
{
return string.Format("WebService说:你输入的数值为: {0}", value);
}
然后我们分别建立Android、iOS以及PCL三个项目,并让Android与iOS都参考到PCL项目,如下图:
接着我们在PCL项目中,使用加入服务参考的方式将WebService加入参考中, 如果有成功找到服务就可以看到先前步骤中所建立的GetData方法,按下确定后加入参考。
至此步骤时, 我们已经可以在Android或iOS项目中叫用加入服务参考后工具所帮我们建立出的Proxy Class, 不过我们都使用了PCL项目了,当然可以将呼叫WebService的动作也写在PCL内, 在PCL项目中建立一个叫做MyService的类别, 并建立一个GetData方法让它的参数与回传值与Service上的GetData相同,如下程序代码:
namespace WebServiceDemo.Service
{
public class MyService
{
public string GetData(int value)
{
}
}
}
在PCL的GetData方法内,就可以开始撰写呼叫Service的代码段了, 首先同样的我们要建立出Proxy类别为Service1Client,与在一般C#使用上不同的是, 在Xamarin中预设并不支援App.config这类档案的读取(意指System.Configuration.*不存在), 所以我们要在建构子内传入EndpointAddress和Binding,并在EndpointAddress内定义WebService的位置,如下程序代码:
var binding=new BasicHttpBinding( BasicHttpSecurityMode.None);
var address=new EndpointAddress("http://testmyws.azurewebsites.net/Service1.svc");
Service1Client service = new Service1Client(binding, address);
建立出proxy类别后,就可以叫用服务中提供的方法了,这时你会发现,只有异步的方法可以呼叫,如下图:
没错,在PCL中使用建立WebService服务时,只提供异步的方法可以使用, 而这种在呼叫方法尾部加上Async以及用来通知结果对应的方法事件名称尾部加上Completed的方式, 称为事件架构异步模式(EAP,全名是Event-based Asynchronous Pattern..不用特别记~知道就好), 因此我们要在MyService中也建立一个Event供外部呼叫? 不需要这么麻烦,在C#5.0后多了async和await关键词, 进而衍生出了以工作为基础的异步模式(TAP,Task-based Asynchronous Pattern), 因此我们可以使用TaskCompletionSource类别将EAP模式转换成为TAP模式,如下代码段:
var task = new TaskCompletionSource<string>();
service.GetDataCompleted += (sender, e) =>
{
if (e.Cancelled)
task.TrySetCanceled();
else if (e.Error != null)
task.TrySetException(e.Error);
else
task.TrySetResult(e.Result);
};
service.GetDataAsync(value);
return task.Task;
改为TAP模式后必须将该方法的回传值改为Task:
public Task<string> GetData(int value)
最后我们以Android为例,建立MyService类别并且呼叫GetData方法, 因GetData回传为Task类型,我们会用到await关键词,因此要在呼叫的方法也加上async关键词,如下:
MyService service = new MyService();
button.Click +=async (sender,e)=>
{
var result =await service.GetData(999);
Toast.MakeText(this, result, ToastLength.Long).Show();
};
两个平台分别以仿真器执行的结果如图:
(15)Visual Studio中使用PCL项目加入WCF WebService参考的更多相关文章
-
[Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考
[Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...
-
Web 应用程序项目与 Visual Studio 中的网站项目的异同
要查看英语原文,请勾选“英语”复选框.也可将鼠标指针移到文本上,在弹出窗口中显示英语原文. 翻译 英语 本文档已存档,并且将不进行维护. Web 应用程序项目与 Visual Studio 中的网站项 ...
-
在Visual Studio中新增生成项目
在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构
-
Visual Studio中的引用项目和直接引用DLL文件
在VS中引用类库时有多种方法,其中用的最多的就是在引用时选择项目选项卡引用本解决方案下的类库项目和选择浏览选项卡直接引用类库DLL文件,实际上这两种引用方式略有不同,今天就为大家总结下. C#本地项目 ...
-
Visual Studio 中指定自定义生成事件
自定义生成事件打开方式 通过指定自定义生成事件,可以在生成开始之前或在它完成之后自动运行命令.在Visual Studio中通过右键项目->属性 进入项目属性菜单. 自定义生成事件的语法 生成事 ...
-
在visual studio中运行C++心得
1.在visual studio中建立C++项目 (1)新建->项目->空项目 C++ (2)右击项目->添加->新建项->C++文件(.app) (3编写C++文件 ...
-
Visual Studio中用于ASP.NET Web项目的Web服务器
当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...
-
如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目
原文: 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目 本主题介绍如何在以下产品中使用 一键式发布 发布(部署)Web 应用程序项目: Visual Studio ...
-
VS2017远程调试C#或 Visual Studio 中的 Visual Basic 项目
来源:远程调试C#或 Visual Studio 中的 Visual Basic 项目 若要调试已部署在另一台计算机的 Visual Studio 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...
随机推荐
-
硬件抽象层:HAL
本节我们研究硬件抽象层:HALHAL,它是建立在Linux驱动之上的一套程序库.刚开始介绍了为什么要在Android中加入HAL,目的有三个,一,统一硬件的调用接口.二,解决了GPL版权问题.三,针对 ...
-
css中关于position属性的探究(原创)
关于position属性的设置,头脑中一直觉得不是很清楚,所以借助这次机会单独自己测试了一下,记作学习笔记. 首先,css的position属性包含下面四种设置情况: static:默认属性.指定 ...
-
虚拟机centos6.5 --安装jdk
1.首先卸载默认安装的openjdk,如下 rpm -qa | grep java #查看当前是否已经安装了跟java有关的包 yum -y remove java #卸载 rpm -qa |grep ...
-
VIM基础
http://www.cnblogs.com/wawlian/archive/2012/05/22/2512801.html http://www.cnblogs.com/wawlian/archiv ...
-
Android 中如何获取 H5 保存在 LocalStorage 的数据
主要分三步: 写个接口,接收 Js 回调 添加到 WebView 主动调用 Js 获取 比如我要获取保存在 LocalStorage 中的 userKey 字段: 1.写个接口,接收 Js 回调 pu ...
-
深入剖析Classloader(二)--根类加载器,扩展类加载器与系统类加载器
原文地址:http://yhjhappy234.blog.163.com/blog/static/31632832201152555245584/?suggestedreading&wumii ...
-
Yii框架下使用redis做缓存,读写分离
Yii框架中内置好几个缓存类,其中有memcache的类,但是没有redis缓存类,由于项目中需要做主从架构,所以扩展了一下: /** * FileName:RedisCluster * 配置说明 * ...
-
relative与absolute相结合
relative会把别人挤下去, absolute会跑偏. 两者结合就会很好的解决问题. <span class='pic_selected' style='position:relative; ...
-
jQuery和DOM对象之间的转换
jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S(’#id’)得到的是 ...
-
ARP/代理ARP
1.ARP首先讲到ARP,ARP是地址解析协议,它的作用是在以太网环境下,通过3层的IP地址来找寻2层的MAC地址,得到一张ARP缓存表.转发数据的时候根据ARP缓存表来进行传输.下图详细说明数据传输 ...