托管 WCF 服务

WCF 中,最让我感到兴奋的方面是它可以把服务托管在任意程序中,而不一定是网站服务器。这开启了一种可能性,即创建的服务,其实现可以动态改变的能力,因为它们能够托管在 fsi.exe。为了使前面的示例能够运行在 fsi.exe,还需要对它做一些修改,但修改相当简单。

清单 11-13 展示了清单 11-9修改后的版本,它能够运行在 fsi.exe。

清单 11-13 托管在 F#交互中的服务

#I @"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0";;

#r "System.ServiceModel.dll";;

open System

open System.ServiceModel

open System.Runtime.Serialization

// a range of greetings that could be used

let mutable f = (fun x -> "Hello: " + x)

f <- (fun x -> "Bonjour: " + x)

f <- (fun x -> "Goedendag: " + x)

// the service contract

[<ServiceContract

(Namespace =

"http://strangelights.com/FSharp/Foundations/WCFServices")>]

type IGreetingService =

[<OperationContract>]

abstract Greet : name:string -> string

// the service implementation

type GreetingService() =

interface IGreetingService with

member x.Greet( name ) = f name

// create a service host

let myServiceHost =

let baseAddress = new Uri("http://localhost:8080/service")

let temp = new ServiceHost(typeof<GreetingService>, [|baseAddress|])

let binding =

let temp =

new WSHttpBinding(Name = "binding1",

HostNameComparisonMode =

HostNameComparisonMode.StrongWildcard,

TransactionFlow = false)

temp.Security.Mode <- SecurityMode.Message

temp.ReliableSession.Enabled <- false

temp

temp.AddServiceEndpoint(typeof<IGreetingService>, binding, baseAddress)

|> ignore

temp

// open the service host

myServiceHost.Open()

注意,在清单 11-13
中的类型 IGreetingService 和 GreetingService与清单 11-9
相比,大部分没有改变,只是把 GreetingService类型改成了可以使用可变函数,这是为了可以控制运行时的动作;然后需要创建服务主机,完成前面示例中网站服务器和 web.config的工作。可以看到在清单 11-10
中的 web.config和在清单 11-9
中的服务本身。注意,myServiceHost包含 baseAddress,这是服务监听请求的地址,还有一个 binding,它控制使用的协议;最后,调用 myServiceHost的
Open 方法,设置服务监听。

然后,对客户端做一改动,使它能重复调用这个服务,如清单 11-14所示,这样,可以看到服务的结果随时间而改变。

清单 11-14 客户端访问托管在 F#交互中的服务

let client = new GreetingServiceClient()

while true do

printfn "%s" (client.Greet("Rob"))

Console.ReadLine() |> ignore

也需要修改客户端的 .config文件,以指向正确的地址:

<endpoint address="http://localhost:8080/service"

做完这些之后,就可以动态改变服务了,如图 11-5所示。

图 11-5 调用动态的 WCF服务

把服务托管在程序的另一个重要原因是能够创建桌面应用程序,监听中心服务器的更新。传统上,这种类应用程序必须选举中心服务器,然而,我们知道,如果这种选举过于频繁,会导致大量不必要的网络流量。

清单 11-15 演示了具体做法。这是一个空窗体,托管了监听来自客户端更新的服务;这里,更新是需要显示的背景图像。服务定义了一个函数 ReceiveImage,它接收组成图像的二进制数据。服务的实现是这样的,每接收到一个图像,就触发事件
newImgEvent;这样,每次接收到新图像以后,窗体就更新。把窗体和事件连接起来非常简单:

newImgEvent.Add(fun img -> form.BackgroundImage <- img)

只需要调用这个事件的 Add
方法,并把它传递给更新窗体的函数就可以了。你将注意到,托管服务所需要的代码(即,定义 myServiceHost的代码)与前面示例相比,没有改变。

清单 11-15 有内置服务的 Windows窗体

open System

open System.IO

open System.Drawing

open System.ServiceModel

open System.Windows.Forms

let myServiceHost =

let baseAddress = new Uri("http://localhost:8080/service")

let temp = new ServiceHost((type Service.ImageService), [|baseAddress|])

let binding =

let temp = new WSHttpBinding()

temp.Name <- "binding1"

temp.HostNameComparisonMode <-

HostNameComparisonMode.StrongWildcard

temp.Security.Mode <- SecurityMode.Message

temp.ReliableSession.Enabled <- false

temp.TransactionFlow <- false

temp

temp.AddServiceEndpoint((type Service.IImageService), binding, baseAddress)

|> ignore

temp

myServiceHost.Open()

let form = new Form()

Service.newImgEvent.Add(fun img -> form.BackgroundImage <- img)

[<STAThread>]

do Application.Run(form)

为了创建客户端,首先必须创建代理,方法同清单 11-11;运行工具 SvcUtil.exe,把服务的 URL作为参数,这将创建 C#
代理,可以把它编译成 .NET程序集,在 F#
中使用。这里,代理命名为 ImageServiceClient。清单 11-16中的客户端定义看上去有点复杂,但是,大量的代码只是绘制窗体上的控件,或打开图像文件;真正重要的代码在最后,把一个函数添加到按钮 Send的
click事件。这段代码从磁盘上读图像,并把它加载到字节数组;字节数组然后传递给代理的 ReceiveImage方法。

清单 11-16 给服务器发送图像的客户端

open System

open System.IO

open System.Windows.Forms

// create a form for sending images

let form =

// create the form itself

let temp = new Form(Width=272, Height=64)

// text box for path to the image

let imagePath = new TextBox(Top=8, Left=8, Width=128)

// browse button to allow the user to search for files

let browse = new Button(Top=8, Width=32, Left=8+imagePath.Right,

Text = "...")

browse.Click.Add(fun _ ->

let dialog = new OpenFileDialog()

if dialog.ShowDialog() = DialogResult.OK then

imagePath.Text <- dialog.FileName)

// send button to send the image to the server

let send = new Button(Top=8, Left=8+browse.Right, Text = "Send")

send.Click.Add(fun _ ->

// open and send the file

let buffer = File.ReadAllBytes(imagePath.Text)

let service = new ImageServiceClient()

service.ReceiveImage(buffer))

// add the controls and return the form

temp.Controls.Add(imagePath)

temp.Controls.Add(browse)

temp.Controls.Add(send)

temp

// show the form

[<STAThread>]

do Application.Run(form)

图 11-6 展示了正在执行中的示例程序;用户将要选择图像发送给客户端。

图 11-6 托管在 Windows窗体中的 WCF
服务

对于能够监听更新的桌面应用程序来说,这远不是故事的全部。发送更新的“客户端”需要知道它应该发送更新给哪一个服务和桌面应用程序。在这个服务中,我们直接通过硬编码服务的地址,使客户端知道的;在实际环境中,还需要用其他方法实现服务。这个服务应该告诉中心“客户端”服务正在监听更新,当服务停止时,向中心“客户端”发出警报;然后中心“客户端”应该需要循环遍历正在监听更新的所有服务,把数据推给每一个服务。

第十一章小结

这一章讨论了用 F#
创建分布式应用程序的几个主要选择;学习了通过 F# 和 .NET库的联合,我们能够更集中精力于创建分布式应用程序的关键技术挑战;还学习了使用 F#
功能控制应用程序的复杂度。在下一章,我们将讨论面向语言编程(language-oriented programming),这项技术经过函数程序员多年的考验,值得信赖,可以真正使程序员的生活更简单。

托管 WCF 服务

时间: 2024-09-29 17:59:31

托管 WCF 服务的相关文章

WCF服务库及其托管-VS2010版

类库只是类的集合,不能单独运行. WCF服务程序项目是可以直接托管执行的,svc文件属于WCF服务的特定文件扩展名,IIS里有对应的处理程序. WCF服务程序可以直接IIS里托管即可,WCF类库需要一个程序来引用并托管它. 1.创建WCF服务库项目 在解决方案中会自动生成了两个类文件"IService.cs"和"Service.cs". 这两个类文件是两个WCF示例文件,对我们开发没有什么用处,现在我们删掉这两个文件. Student.cs using System

WCF服务编程 读书笔记——第1章 WCF基础(1)

第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Binding).契约(Contract)和终结点(Endpoint):了解如何托管服务,如何编写客户端代码:了解WCF的相关主题,诸如进程内托管(In-Proc Hosting)以及可靠性的实现.即使你已经熟知WCF的基本概念,仍然建议你快速浏览本章的内容,它不仅能够巩固你的已有知识,而且本章介绍的一

IIS 中托管基于TCP绑定的WCF服务

IIS 中托管基于TCP绑定的WCF服务 一.创建一个基于TCP绑定的WCF服务 1.创建一个的简单的服务具体代码如下 服务契约定义 namespace SimpleService { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IHelloService”. [ServiceContract] public interface IHelloService { [OperationContract] string GetMessage(string m

WCF服务库实现自托管,无需装iis

如何做到不安装iis的情况下, 实现客户端与服务器的数据交互? 业务背景: 1.省了销售人员或者客服人员需要在客户端配置iis问题.发布站点操作 2.后期为实现单机板客服端也能较为快捷方便 服务端: 首先我们需要创建WCF服务库 默认的服务库中已有Service(实现类)与IService (接口类) 顾名思义,实现类是处理逻辑使用,接口类是提供给外部调用的类 重点: 1.创建服务托管类,创建个静态无返回值Main方法(此方法名固定不变) 2.引用System.ServiceModel 3.创建

三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路

回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G        前言:以前的系统都是直接客户端直连数据库服务器,后来考虑到服务器的安全性.数据库连接数的限制.分布能力差等问题,特别是那几年中间件.SOA.ESB等炒得比较火,为了跟上时代脚本有必要开发一个中间件,把后台逻辑业务在中间件中运行.刚开始考虑过WebS

WCF服务二:创建一个简单的WCF服务程序

在本例中,我们将实现一个简单的计算服务,提供基本的加.减.乘.除运算,通过客户端和服务端运行在同一台机器上的不同进程实现. 一.新建WCF服务 1.新建一个空白解决方案,解决方案名称为"WCFSolution". 2.解决方案右键->添加->类库项目,类库名称为CalculateWcfService. 3.创建服务契约 WCF采用基于契约的交互方式实现了服务的自制.服务契约:是相关操作的集合.契约就是双方或多方就某个关注点达成的一种共识,是一方向另一方的一种承诺.签署了某个

WCF--建立简单的WCF服务

在VS2010里建立一个最简单的WCF服务,基本流程如下: 一:新建WCF应用 首先,新建一个WCF服务的应用,如下图所示 建立完成之后,VS将自动生成一个最简单的WCF工程,在这个应用中,包含了最基本Contract.Service. 工程如下: 不需要编辑任何文件,直接编译生成,得到一个WcfService1.dll文件 二.WCF应用中的契约(Contract) 在生成的WCF工程中,IService1.cs中为Contract(本例中契约和服务放在同一个工程下了,实际上也可以分为两个工程

WCF服务开发与调用的完整示例

开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IService1.cs和Service1.cs两个类文件.我们可以直接对其修改开发我们的服务,但一般直接删除. 第二步:开发实体类 在解决方案中,添加新类Module.cs 在类中要首先引入using System.Runtime.Serialization命名空间 实体类具体代码如下: namespace WcfServiceLib.mo

IIS10 设置支持wcf服务(.svc)

感谢: http://www.cnblogs.com/dudu/p/3328066.html 如果提示web.config配置重复的话,很有可能是.net framework版本的问题,把IIS中的版本设置为2.0就可以了. 如何让IIS10支持WCF服务呢? 1. 首先添加MIME类型:扩展名“.svc”,MIME类型 “application/octet-stream”: 2. 然后在“Handler Mappings(处理程序映射)”中添加Managed Handler(添加托管处理程序)