博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(15)Visual Studio中使用PCL项目加入WCF WebService参考
阅读量:7118 次
发布时间:2019-06-28

本文共 2307 字,大约阅读时间需要 7 分钟。

原文 

Visual Studio中使用PCL项目加入WCF WebService参考
作者:Steven Chang 2015/01
 

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();
};

两个平台分别以仿真器执行的结果如图:

相关下载
  • 范例文件下载
参考信息
  • EAP模式
  • TAP模式
  • EAP to TAP

转载地址:http://egnel.baihongyu.com/

你可能感兴趣的文章
android之Handler详解
查看>>
小积累,大收获
查看>>
JS、CSS合并带来的效率提升
查看>>
Json 语法 格式
查看>>
面试思考,入职初期怎么做
查看>>
php---需要判断远程URL是否有效
查看>>
我的友情链接
查看>>
java中使用switch case报错case expressions must be constant expressions
查看>>
Android开发网
查看>>
关于加域后win7、win8的C:\不能够新建文件,报0X0070522错误的解决方式
查看>>
安卓反编译揭秘,伪加密APK文件如何被破坏
查看>>
Advanced Bash Sell Scripting学习笔记1
查看>>
转:10+年程序员总结的20+条经验教训
查看>>
linux基础命令学习之mv(7)
查看>>
我的友情链接
查看>>
nagios的实时监控
查看>>
firewalld
查看>>
Vue按需加载提升用户体验
查看>>
MySQL--字符编码和字符集
查看>>
mvn命令
查看>>