(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 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...
随机推荐
- mysql学习(七)-索引学习
常规索引: 在常用查询的字段上使用常规索引 创建表时一块创建索引 create table if not exists carshop(id int not null auto_increment, ...
- 在vim保存时获得sudo权限
在维护线上服务的时候,经常要编辑一些不属于操作用户的文件,比如只有r权限的文件,每次保存都会提示read only.这时可以使用如下命令代替原有的 :wq 命令 :w !sudo tee % 命令:w ...
- SQL Server 文件流文件组
背景: 文件流通过在文件系统上存储blob数据文件将数据库引擎与ntfs文件集成在一起,使用t-sql和win32访问数据. 文件流使用windows系统来缓存数据,有助于在减少文件流数据对sql s ...
- Static Function Test
public class StaticTestCls { public int x = 0; public static int y = 0; private void SetValue_Object ...
- delphi SysErrorMessage 函数和系统错误信息表 good
在看 API 文档时, 我们经常见到 GetLastError; 它可以返回操作后系统给的提示. 但 GetLastError 返回的只是一个信息代码, 如何返回对应的具体信息呢? FormatMes ...
- Flex中如何通过设置GridLines对象的horizontalAlternateFill样式交错显示LineSeries图表背景颜色的例子
原文 http://blog.minidx.com/2008/11/27/1652.html 接下来的例子演示了Flex中如何通过设置GridLines对象的horizontalAlternateFi ...
- setTimeout()与setInterval() 问题
提示:setTimeout() 只执行 code 一次.如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout(). 1. setInterval(c ...
- poj3030
#include <stdio.h> #include <stdlib.h> int main() { int n,r,e,a; scanf("%d",&a ...
- Hoeffding连接到机器学习
统计学场景: 一个罐子中有红球和绿球,红球比例$v$未知,数量未知,如何得到红球比例?方法---随机抽样N个球,在其中红球占比为$u$ 由hoeffding可以知道:$P(|u-v|>\epsi ...
- python 的一些高级编程技巧
正文: 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数据一致性的要求或是对索引的要求等,同时也可以将各种数据结构合 ...