【Win 10应用开发】手动调用WCF服务

调用服务最简单的方法就是,直接在VS里面添加服务引用,输入服务的地址即可,无论是普通Web服务,还是WCF服务均可。VS会根据获取到的元数据,自动生成客户端代码。

如果服务的调用量很大,应用广泛,可以放在IIS上作为一种Web资源使用。但WCF不限于此,它可以在一个进程中运行,或者可以放到Windows服务进程上运行,实则是一种Windows平台的万能通信技术。

为了装逼,今天老周将演示如何手动调用WCF,仅通过Channel(通道)就可以调用。其实,在某些时候,手动也有手动的好处,手动调用的话,代码量不多,也比较灵活。

当然,这个演示仅供参考。

为了顺利完成装逼演示,首先得弄个服务示例,以往常用的是做一个执行加减乘除的服务来测试,今天既然要装逼,就装得有创意一点,就来一个计算N次方的吧,比如2的3次方为8。

不知各位是否记得建立WCF的步骤,这么小的程序,就不用IIS来运行了,直接用一个控制台应用程序可以了,简单大方美观有层次。

首先要声明服务协定。

    [ServiceContract(Name = "pow_service", Namespace = "http://my")]
    interface IService
    {
        [OperationContract(Name = "pow", Action = "PowAction", ReplyAction = "PowReply")]
        double Pow(double x, double y);
    }

协定只是个接口,在服务器端要实现它,但在客户端不需要知道实现这接口的代码,只要在客户端也定义一个这样的接口,就可以了。当然,如果你不想重复定义协定,你可以把这个接口定义到一个共享的类库中,最好用可移植的库,这样保证平台万能性。

在服务器和客户端中分别定义协定接口有一个好处就是可以两边不必保持一致,接口名、接口的方法都可以不同,参数名也可以不同,只要参数 的顺序、类型、数量,以及返回值的类型相同就可以。

重点是附加在接口上的ServiceContractAttribute,和附加到方法上的OperationContractAttribute特性。服务器和客户端的接口名字可以不同,只要附加的这些特性的属性值相同即可。

所以,在Win10 App客户端,我可以自己声明这样的接口:

    [ServiceContract(Name = "pow_service", Namespace = "http://my")]
    interface IPowService
    {
        [OperationContract(Name = "pow", Action = "PowAction", ReplyAction = "PowReply")]
        Task<double> PowAsync(double x, double y);
    }

你不妨看一下,接口名字和接口成员名字不同,但标注的协定特性是相同的。所谓的协定者,就是服务器和客户端之间必须有一点“默契”,协定接口就是一种规范,不然,客户端不知道服务有哪些操作方法,就无法调用了。

协定完成后,在服务器端要实现协定接口,进行具体的操作。

    class PowService : IService
    {
        public double Pow(double x, double y)
        {
            double res = Math.Pow(x, y);
            return res;
        }
    }

承载在进程上的WCF比较好处理,不用太复杂的配置,几行代码就可以启动服务主机。

            using (ServiceHost host = new ServiceHost(typeof(PowService)))
            {
                NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);

                // 直接添加终结点
                host.AddServiceEndpoint(typeof(IService), binding, "net.tcp://localhost:1700/pow");

                host.Opened += (h, ea) => Console.WriteLine("服务已打开。");
                // 打开服务
                try
                {
                    host.Open();
                }
                catch (Exception ex) { Console.WriteLine(ex.Message); }

                Console.ReadKey();
            }

其实很Easy,ServiceHost负责运行服务,可解释为服务主机。因为是手动访问服务,基址可以省略。然后你直接将服务协定相应地作为终结点添加到服务主机中即可。在添加终结点时,需要指明协定的Type,一个Binding,当然还要包含地址。

这里我选用TCP协议来通信,就用NetTcpBinding类,NET TCP的地址要以“net.tcp:”开头。

之后,直接Open就可以运行服务了。

注意这个服务只能手动调用,不能用服务引用生成代码,因为没有公开元数据,生成代码时会找不到WSDL。

=========================================================

然后在Windows App客户端中就可以直接调用了。

            // 终结点地址
            EndpointAddress ep = new EndpointAddress("net.tcp://localhost:1700/pow");
            // TCP绑定
            NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);

            // 创建通道
            ChannelFactory<WCFSVContracts.IPowService> factory = new ChannelFactory<WCFSVContracts.IPowService>(binding, ep);
            WCFSVContracts.IPowService channel = factory.CreateChannel();

            // 调用服务
            double x = double.Parse(txt1.Text);
            double y = double.Parse(txt2.Text);
            double r = await channel.PowAsync(x, y);
            tbres.Text = $"计算结果:{r:G}";

WCFSVContracts.IPowService就是在客户端上重新定义的服务协定,但协定的特性要与服务相同,接口名字可以不同。这个上面贴过代码,下面我再贴一段完整的。

using System;
using System.ServiceModel;
using System.Threading.Tasks;

namespace WCFSVContracts
{
    [ServiceContract(Name = "pow_service", Namespace = "http://my")]
    interface IPowService
    {
        [OperationContract(Name = "pow", Action = "PowAction", ReplyAction = "PowReply")]
        Task<double> PowAsync(double x, double y);
    }
}

与服务器上的定义有些不同的是,在客户端中,我将操作方法声明为支持异步等待,即返回Task<TResult>,这个是允许的,大家不必怀疑。

你会看到,在客户端上调用也是挺简单的,首先用一个EndpointAddress表示终结点的地址,这个地址必须和服务器上添加的终结点的地址一致,否则找不到服务。

然后实例化一个NetTcpBinding对象,Binding的类型与属性值必须与服务器上的Binding一致。服务器上的NetTcpBinding的安全模式设置为None,客户端上的也要设置为None。因为也不是什么见不得人的数据,就禁用安全模式。

最后,用一个ChannelFactory<TChannel>就可以完成服务调用。TChannel的类型就是协定接口,随着当调用CreateChannel方法时,它所创建的通道就以协定接口为基础返回,它返回的实际类型是一个动态类型,但它可以以协定接口为基础来调用。

运行结果如下图。

示例代码下载

时间: 2024-08-18 23:24:02

【Win 10应用开发】手动调用WCF服务的相关文章

转载——Java与WCF交互(一):Java客户端调用WCF服务

最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参考: 第一步:生成WCF服务 新建WCF解决方案,分别添加三个项目,HelloTimeService(类库),HelloTimehost(控制台程序),HelloTimeClient(控制台程序),项目结构如图:各个项目的主要代码:service: Host: Client: 编译通过后,测试Hos

Android基于ksoap2调用WCF服务(二):Android篇

上一篇通过一个非常简单的例子,完成了一个WCF的服务.接下来介绍一下Android端. Android端调用WCF,采用基于ksoap2包来实现. 下载地址(这个需要fan qiang访问,你们懂的):https://code.google.com/p/ksoap2-android/ 我用的3.3.0版本,我传到csdn上,上面地址如果不能访问,可以用这个地址:http://download.csdn.net/detail/cnryc/7695437 程序的源代码下载地址:http://down

学习调用WCF服务的各种方法

1.开发工具调用WCF 这中方法很方便也很简单,很多工作VS就帮我们完成了.相信大家也不会对这种方法陌生.这里简单提一下.打开VS,在项目中添加服务引用: 在config中自动声明了有关服务的节点信息,这样VS就创建了调用服务的代理: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->ServiceReference1.Service1Client

【Win 10应用开发】如何知道当前APP在哪个平台设备上运行

[Win 10应用开发]如何知道当前APP在哪个平台设备上运行 在做Win10开发的时候,我们可能经常会需要获得当前程序在在哪个平台设备上运行,用于UI和相关API的调用,那么可以通过什么方式知道当前APP运行的平台呢? 今天这里提供两个方法给大家做参考: 方法一:DeviceFamily 通过Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily,来获取当前的平台设备,目前只可以得到两个值Windows.Mobile或Wind

Silverlight客户端调用WCF服务难题解疑

Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平台解决方案.对于这样一款功能性较强的工具,我们在实际使用中通常也会遇到一些问题.在这里就来了解一下其中Silverlight客户端调用WCF服务的一些难题解疑. WCF服务端做好后,可以通过SVCUTIL.exe工具生成客户端代码和配置文件,这些内容比较简单,在这里就不做详细介绍. 但是,如果使用Silverli

【Win 10 应用开发】打印UI元素

原文:[Win 10 应用开发]打印UI元素 Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印,主要依靠以下几个类型: PrintManager:位于Windows.Graphics.Printing命名空间,主要负责显示打印对话框,设置打印源等操作.在使用时,首先调用GetForCurrentView静态方法得到一个PrintManager实例:

【Win 10应用开发】实现全屏播放的方法

原文:[Win 10应用开发]实现全屏播放的方法 有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整个窗口,就等于全屏播放了,但是,Win10应用是窗口化的,将MediaElement控件的IsFullWindow属性设置为true后,就会这样: 从上面的截图看,MediaElement控件只是覆盖整个窗口而已,并没有实现全屏.那有办法让它全屏播放

【Win 10应用开发】如何知道UAP在哪个平台上运行

原文:[Win 10应用开发]如何知道UAP在哪个平台上运行 面向22世纪的现代化应用程序可以同时在多种设备上运行,于是有朋友会有一个疑问:有时候,我们还真的需要判断一下,UAP应用程序在哪个平台上运行.尽管大多情况下我们不必要这样做,但某些特殊情况还得考虑.比如一串数据列表,我希望如果在桌面上运行时就以横向列表展现:但要是运行在手机上就以纵向列表展现. 也就是说,其实我们只需分析两种情况即可: 一.桌面.(台式机.笔记本.平板.游戏机.发广告专用机.导航器……) 二.移动环境.其实就是手机.

jquery或者JavaScript调用WCF服务的方法

/****************************************************************** * Copyright (C): 一心堂集团 * CLR版本: 4.0.30319.18063 * 命名空间名称: WcfService1 * 文件名: IJoonService * GUID1: b7bd3ab3-3668-4727-9416-f9845da207e1 创建人:尹明能 * 创建时间: 2014-9-24 13:13:09 ***********