(15)Visual Studio中使用PCL项目加入WCF WebService参考
原文 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 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...
随机推荐
- Fedora 开启 ssh
Fedora 17 已经安装好openssh server了 不用再装 不过默认无开启 首先su root1.开启ssh服务# systemctl start sshd.service 2.随系统一起 ...
- Android动画之硬件加速
你的动画写出来卡嘛?流畅嘛 如果你想提升动画的性能,那就是用它-hardware layers. During animations your views may be redrawn each fr ...
- Android dialog 不消失
最近在做Android4.0的开发,发现AlertDialog相比较以前有了较大变化,就是在触摸对话框边缘外部,对话框消失 于是研究其父类发现,可以设置这么一条属性,当然必须先AlertDialog. ...
- Linux07--Shell程序设计03 通配符与正则表达式
通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统 ...
- Codeforces 339E
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> # ...
- 使用JS控制struts的日期控件datetimepicker
功能需求:页面主要有两个日历框,一个是当前日期,一个是去年同期,要求当用户改变当前日期时,同步修改去年同期为当前日期-1年. 当时刚接触到需求的第一时间想到的就是为< sx:datetimepi ...
- 在asp.net中如何实现伪静态页 [转]
我在这里就不过多讨论静态页.伪静态页.动态页的长短利弊了.只是单纯的讲解如何在asp.net中如何实现伪静态页,以帮助有这方面有需求的朋友,快速解决boss派下来的任务.(拿奖金的时候,记得有我一份功 ...
- C#性能优化实践【转】
性能主要指两个方面:内存消耗和执行速度.性能优化简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短. 本文以.NET平台下的控件产品MultiRow为例,描述C# ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- java中文乱码解决之道(五)—–java是如何编码解码的
原文出处:http://cmsblogs.com/?p=1491 在上篇博客中LZ阐述了java各个渠道转码的过程,阐述了java在运行过程中那些步骤在进行转码,在这些转码过程中如果一处出现问题就很有 ...