(15)Visual Studio中使用PCL项目加入WCF WebService参考

简介: 原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2015/01   APP在应用时经常会用到WebService服务,在Xamar...

原文 Visual Studio中使用PCL项目加入WCF WebService参考

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

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

目录
相关文章
|
4月前
|
Web App开发
Visual Studio Code 直接启动项目
Visual Studio Code 直接启动项目
79 0
|
4月前
|
存储 安全 测试技术
使用 Visual Studio Code 创建 SAP UI5 项目遇到 self-signed security certificate 相关问题
使用 Visual Studio Code 创建 SAP UI5 项目遇到 self-signed security certificate 相关问题
|
1月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
46 0
|
4月前
|
编译器 C++
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
163 0
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
|
4月前
|
Windows
Qt 5.14.2 打造跨平台应用的秘诀:用Visual Studio 2022和Qt 5.14.2轻松创建你的首个QT项目
Qt 5.14.2 打造跨平台应用的秘诀:用Visual Studio 2022和Qt 5.14.2轻松创建你的首个QT项目
393 0
|
4月前
|
C++
Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库解决方案
Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库解决方案
557 0
|
4月前
|
安全 编译器 Linux
环境搭建与工具的项目创建(Microsoft Visual Studio 2022)
环境搭建与工具的项目创建(Microsoft Visual Studio 2022)
100 0
|
4月前
|
定位技术 C++
Visual Studio复制、拷贝C++项目与第三方库配置信息到新的项目中
Visual Studio复制、拷贝C++项目与第三方库配置信息到新的项目中
117 2
|
4月前
|
C++ 计算机视觉
Visual Studio新项目快速配置已有项目中编译好的C++第三方库的方法
Visual Studio新项目快速配置已有项目中编译好的C++第三方库的方法
126 1
|
4月前
|
开发框架 .NET PHP
Web Deploy配置并使用Visual Studio进行.NET Web项目发布部署
Web Deploy配置并使用Visual Studio进行.NET Web项目发布部署