WCF 第四章 绑定 netMsmqBinding

MSMQ 为使用队列创建分布式应用程序提供支持。WCF支持将MSMQ队列作为netMsmqBinding绑定的底层传输协议的通信。 netMsmqBinding绑定允许客户端直接把消息提交到一个队列中同时服务端从队列中读取消息。客户端和服务端之间没有直接通信过程;因此,通信本 质是断开的。也意外着所有的通信必须是单向的。因此,所有的操作必须要在操作契约上设置IsOneWay=true属性。

提示 动态创建队列

使用netMsmqBinding时动态创建MSMQ队列是很普通的。当创建一个离线客户端应用而且队列在一个用户的桌面时使用netMsmqBinding绑定更加平常。这可以通过创建System.MessageQueue类的静态方法来实现。

下面的代码显示了netMsmqBinding绑定的地址格式:

  net.msmq:{hostname}/[private/|[public/]]{query name}

  MSMQ默认端口是1801而且没有配置解决方案。注意地址格式中的public和private.你可以显式的确定是否队列名字指向一个私有的或者公有的队列。默认情况下,队列名字假设指向一个公共队列。

表4.11 netMsmqBinding 绑定属性

 

  我们在列表4.2到4.4使用的StockQuoteService样例程序需要被修改以便于与netMsmqBinding绑定一起工作。 netMsmqBinding绑定仅支持单向操作(查看表4.2).我们之前的操作契约使用一个请求回复消息交换模式(查看列表4.4).我们将修改 StockQuoteService例子来显示基于netMsmqBinding绑定的双向通信而不是显示一个不同的例子。

  我们需要使用两个单向操作契约来维护服务端和客户端的双向通信。这意味着我们需要重新定义我们的契约以便于使用netMsmqBinding绑 定。列表4.24显示了写来与netMsmqBinding绑定一起使用的stock quote 契约。首先,注意我们把请求和回复契约转换成两个独立的服务契约:IStockQuoteRequest和IStockQuoteResponse.每个 契约上的操作都是单向的。IStockQuoteRequest契约将被客户端用来向服务端发送消息。IStockQuoteResponse契约将被服 务端用来发送一条消息给客户端。这意味着客户端和服务端都将寄宿服务来接收消息。

列表 4.24 IStockQuoteRequest,IStockQuoteResponse和StockQuoteRequestService

01using System;
02using System.Collections.Generic;
03using System.Linq;
04using System.Text;
05using System.ServiceModel;
06using System.Transactions;
07 
08namespace EssentialWCF
09{
10    [ServiceContract]
11    public interface IStockQuoteRequest
12    {
13        [OperationContract(IsOneWay=true)]
14        void SendQuoteRequest(string symbol);
15    }
16 
17    [ServiceContract]
18    public interface IStockQuoteResponse
19    {
20        [OperationContract(IsOneWay = true)]
21        void SendQuoteResponse(string symbol, double price);
22    }
23 
24    public class StockQuoteRequestService : IStockQuoteRequest
25    {
26        public void SendQuoteRequest(string symbol)
27        {
28            double value;
29            if (symbol == "MSFT")
30                value = 31.15;
31            else if (symbol == "YHOO")
32                value = 28.10;
33            else if (symbol == "GOOG")
34                value = 450.75;
35            else
36                value = double.NaN;
37 
38            //Send response back to client over separate queue
39            NetMsmqBinding msmqResponseBinding = new NetMsmqBinding();
40            using (ChannelFactory<IStockQuoteResponse> cf = new ChannelFactory<IStockQuoteResponse>("NetMsmqResponseClient"))
41            {
42                IStockQuoteResponse client = cf.CreateChannel();
43                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
44                {
45                    client.SendQuoteResponse(symbol, value);
46                    scope.Complete();
47                }
48                cf.Close();
49            }
50        }
51    }
52}

   netMsmqBinding下一个要考虑的就是使用ServiceHost类。先前的例子可以在不同的绑定上重用相同的ServiceHost代码。这 因为服务契约可以保持一样。而不是因为使用了netMsmqBinding。更新的用来寄宿StockServiceRequestService服务的 ServiceHost代码在列表4.25中显示。我们已经更新代码来动态创建一个在基于配置文件中queueName的MSMQ队列。这有助于通过简单 配置允许程序部署而不需要额外的MSMQ配置。

列表 4.25 StockQuoteRequestService ServiceHost 服务

01using System;
02using System.Collections.Generic;
03using System.Linq;
04using System.Text;
05using System.ServiceModel;
06using System.Configuration;
07using System.Messaging;
08 
09namespace EssentialWCF
10{
11    class Program
12    {
13        static void Main(string[] args)
14        {
15            MyServiceHost.StartService();
16            Console.WriteLine("Service is Started, press Enter to terminate.");
17            Console.ReadLine();
18            MyServiceHost.StopService();
19        }
20    }
21 
22    internal class MyServiceHost
23    {
24        internal static string queryName = string.Empty;
25        internal static ServiceHost myServiceHost = null;
26 
27        internal static void StartService()
28        {
29            queryName = ConfigurationManager.AppSettings["queueName"];
30            if (!MessageQueue.Exists(queryName))
31                MessageQueue.Create(queryName, true);
32            myServiceHost = new ServiceHost(typeof(EssentialWCF.StockQuoteRequestService));
33            myServiceHost.Open();
34        }
35        internal static void StopService()
36        {
37            if (myServiceHost.State != CommunicationState.Closed)
38                myServiceHost.Close();
39        }
40    }
41}

   列表4.26的配置信息使用netMsmqBinding绑定暴露StockQuoteRequestService服务。它也为IStockQuoteResponse契约配置一个客户端终结点以便于回复可以发送给客户端。

列表 4.26 netMsmqBinding 宿主 配置

01<?xml version="1.0" encoding="utf-8" ?>
02<configuration>
03    <system.serviceModel>
04        <client>
05            <endpoint address="net.msmq://localhost/private/stockquoteresponse"
06                binding="netMsmqBinding" bindingConfiguration="NoMsmqSecurity"
07                contract="EssentialWCF.IStockQuoteResponse" name="NetMsmqResponseClient" />
08        </client>
09        <bindings>
10            <netMsmqBinding>
11                <binding name="NoMsmqSecurity">
12                    <security mode="None" />
13                </binding>
14            </netMsmqBinding>
15        </bindings>
16        <services>
17            <service name="EssentialWCF.StockQuoteRequestService">
18                <endpoint address="net.msmq://localhost/private/stockquoterequest"
19                    binding="netMsmqBinding" bindingConfiguration="NoMsmqSecurity"
20                    name="" contract="EssentialWCF.IStockQuoteRequest" />
21            </service>
22        </services>
23    </system.serviceModel>
24  <appSettings>
25    <add key="queueName" value=".\private$\stockquoterequest"/>
26  </appSettings>
27</configuration>

  客户端应用程序必须使用netMsmqBinding寄宿一个服务来接受回复且配置一个终结点来发送请求给服务端。列表4.27 显示了客户端用来寄宿一个实现了IStockQuoteResponse契约的ServiceHost类。我们添加代码来动态创建一个客户端监听的队列。 再次,这有助于通过简单配置允许程序部署而不需要额外的MSMQ配置。

列表 4.27 StockQuoteResponseService ServiceHost 客户端

01using System;
02using System.Collections.Generic;
03using System.Linq;
04using System.Text;
05using System.ServiceModel;
06using System.Configuration;
07using System.Messaging;
08 
09namespace EssentialWCF
10{
11    internal class MyServiceHost
12    {
13        internal static ServiceHost myServiceHost = null;
14 
15        internal static void StartService()
16        {
17            string queryName = ConfigurationManager.AppSettings["queueName"];
18            if (!MessageQueue.Exists(queryName))
19                MessageQueue.Create(queryName, true);
20            myServiceHost = new ServiceHost(typeof(EssentialWCF.Program));
21            myServiceHost.Open();
22        }
23        internal static void StopService()
24        {
25            if (myServiceHost.State != CommunicationState.Closed)
26                myServiceHost.Close();
27        }
28    }
29}

   列表4.28 显示了IStockQuoteResponse接口的客户端实现。客户端实现了接口,接下来被服务端当作发送回复的回调端。这不是使用了WCF中的双向能力。相反的,回调使用一个单独的单向绑定实现。

01using System;
02using System.Collections.Generic;
03using System.Linq;
04using System.Text;
05using System.Threading;
06using System.ServiceModel;
07using System.Transactions;
08 
09namespace EssentialWCF
10{
11    public class Program : IStockQuoteResponse
12    {
13        private static AutoResetEvent waitForResponse;
14        static void Main(string[] args)
15        {
16            //Start response service host
17            MyServiceHost.StartService();
18            try
19            {
20                waitForResponse = new AutoResetEvent(false);
21                //Send request to the server
22                using (ChannelFactory<IStockQuoteRequest> cf = new ChannelFactory<IStockQuoteRequest>("NetMsmqRequestClient"))
23                {
24                    IStockQuoteRequest client = cf.CreateChannel();
25                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
26                    {
27                        client.SendQuoteRequest("MSFT");
28                        scope.Complete();
29                    }
30                    cf.Close();
31                }
32                waitForResponse.WaitOne();
33            }
34            finally
35            {
36                MyServiceHost.StopService();
37            }
38            Console.ReadLine();
39        }
40 
41        public void SendQuoteResponse(string symbol, double price)
42        {
43            Console.WriteLine("{0}@${1}", symbol, price);
44            waitForResponse.Set();
45        }
46    }
47}

   让netMsmqBinding Stock Quote 样例工作起来的最后一步是客户端配置文件。列表4.29 显示了客户端配置,包含了寄宿IStockQuoteResponse服务实现的信息,调用IStockQuoteRequest服务的终结点配置。

列表 4.29 netMsmqBinding 客户端配置

view sourceprint?
01<?xml version="1.0" encoding="utf-8" ?>
02<configuration>
03    <system.serviceModel>
04        <bindings>
05            <netMsmqBinding>
06                <binding name="NoMsmqSecurity">
07                    <security mode="None" />
08                </binding>
09            </netMsmqBinding>
10        </bindings>
11        <client>
12            <endpoint address="net.msmq://localhost/private/stockquoterequest"
13                binding="netMsmqBinding" bindingConfiguration="NoMsmqSecurity"
14                contract="EssentialWCF.IStockQuoteRequest" name="NetMsmqRequestClient" />
15        </client>
16        <services>
17            <service name="EssentialWCF.StockQuoteRequestService">
18                <endpoint address="net.msmq://localhost/private/stockquoteresponse"
19                    binding="netMsmqBinding" bindingConfiguration="NoMsmqSecurity"
20                    contract="EssentialWCF.IStockQuoteResponse" />
21            </service>
22        </services>
23    </system.serviceModel>
24  <appSettings>
25    <add key="queueName" value=".\private$\stockquoteresponse"/>
26  </appSettings>
27</configuration>


===========

转载自

作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
 

转载于:https://www.cnblogs.com/llbofchina/archive/2011/06/29/2093025.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 18 RC 版本发布啦,生产环境用起来!

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列今天给…

阿拉伯语排版设计_针对说阿拉伯语的用户的测试和设计

阿拉伯语排版设计Let me start off with some data to put things into perspective “Why?”让我从一些数据入手&#xff0c;以透视“为什么&#xff1f;”的观点。 Arabic is the 5th most spoken language worldwide, with 420 million speakers, and is an official lang…

SVN:“SVN”不是内部命令,解决方法

1、安装完TortoiseSVN-1.6.16.21511-x64-svn-1.6.17.msi 2、在运行窗口cmd---svn&#xff0c;提示&#xff1a; “SVN” 不是内部命令 郁闷&#xff0c;小有纠结 解决方法&#xff1a;安装Slik-Subversion-1.6.17-x64.msi 命令行窗口关闭&#xff0c;再次打开命令行窗口&#x…

7个月,4000+人,500+源码笔记,诚邀你参加源码共读~

大家好&#xff0c;我是若川。按照从易到难的顺序&#xff0c;前面几期&#xff08;比如&#xff1a;validate-npm-package-name、axios工具函数&#xff09;很多都只需要花2-3小时就能看完&#xff0c;并写好笔记。但收获确实很大。开阔视野、查漏补缺、升职加薪。已经有400笔…

火焰和烟雾的训练图像数据集_游戏开发者是烟雾和镜子的大师

火焰和烟雾的训练图像数据集Video games are incredible. They transport us to new worlds, allow us to partake in otherwise impossible situations, and empower us in our every day lives. Games can make us feel like a part of something bigger than ourselves, per…

平衡树SPLAY

一个比线段树代码还要又臭又长的数据结构&#xff0c;各式各样的函数&#xff0c;咱也不知道别人怎么记住的&#xff0c;咱也不敢问 SPLAY的性质 1.某个节点的左子树全部小于此节点&#xff0c;右子树全部大于此节点 2.中序遍历splay输出的序列是按从小到大的顺序 &#xff08;…

为支持两个语言版本,我基于谷歌翻译API写了一款自动翻译的 webpack 插件

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列本文来…

全球 化 化_全球化设计

全球 化 化重点 (Top highlight)Designing for a global audience can feel daunting. Do you localize your product? Or, do you internationalize your product? And what does that even entail?为全球观众设计可能会令人生畏。 您是否将产品本地化&#xff1f; 还是您将…

springMVC_数据的处理过程

1、DispatcherServlet&#xff1a;作为前端控制器&#xff0c;负责分发客户的请求到 Controller 其在web.xml中的配置如下&#xff1a; <servlet><servlet-name>dispatcherServlert</servlet-name><servlet-class>org.springframework.web.servlet.Dis…

JavaScript 新增两个原始数据类型

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列JavaS…

axure低保真原型_如何在Google表格中创建低保真原型

axure低保真原型Google Sheets is a spreadsheet, just like Microsoft Excel.Google表格是一个电子表格&#xff0c;就像Microsoft Excel一样。 Most people associate it with calculating numbers. But Google Sheets is actually great for organizing your ideas, making…

Lerna 运行流程剖析

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列Lerna…

手动创建线程池 效果会更好_创建更好的,可访问的焦点效果

手动创建线程池 效果会更好Most browsers has their own default, outline style for the :focus psuedo-class.大多数浏览器对于&#xff1a;focus psuedo-class具有其默认的轮廓样式。 Chrome’s default outline styleChrome浏览器的默认轮廓样式 This outline style is cr…

eazy ui 复选框单选_UI备忘单:单选按钮,复选框和其他选择器

eazy ui 复选框单选重点 (Top highlight)Pick me! Pick me! No, pick me! In today’s cheat sheet we will be looking at selectors and how they differ. Unlike most of my other cheat sheets, this will focus on two components (radio buttons and checkboxes) side by…

VS2010 VC Project的default Include设置

http://blog.csdn.net/jeffchen/article/details/5491435 VS2010与以往的版本一个最大的不同是&#xff1a;VC Directory设置的位置和以前的版本不一样。VS2010之前&#xff0c;VC Directory的设置都是在IDE的Tools->Options中设置的&#xff1b;VS2010改为&#xff0c;分别…

初级中级高级_初级职位,(半)高级职位

初级中级高级As a recent hire at my new job, as expected, a lot of things seemed scary and overwhelming. The scariest part was not the unfamiliarity with certain tasks or certain tools, but in communicating with higher-level coworkers, managers and bosses. …

如何写好技术文章(看张鑫旭老师的直播总结

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列本文是…

iOS 流媒体 基本使用 和方法注意

项目里面需要添加视频方法 我自定义 选用的是 avplayer 没选择 MediaPlayer 原因很简单 , avplayer 会更容易扩展 有篇博客 也很好地说明了 使用avplayer的优越性 blog.csdn.net/think12/article/details/8549438在iOS開發上&#xff0c;如果遇到需要播放影片&#xff0c;…

figma下载_迁移至Figma

figma下载Being an intuitive and user-friendly tool and having the possibility of real-time collaboration are some of the main reasons people choose to use Figma. But the migration process to Figma may sometimes be painful or time-consuming. 人们选择使用Fig…

TypeScript 常用的新玩法

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列上周分…