转 如何在调用WCF服务之前弹出一个确认对话框
自定义InteractiveChannelInitializer(InvocationConfirmationInteractiveChannelInitializer)定义如下。我们在BeginDisplayInitializationUI方法中弹出一个确认对话框,并将用户的确认选择封装到一个简单的AsyncResult对象中返回。在EndDisplayInitializationUI方法中,通过AsyncResult对象确认用户是否取消本次服务调用,如果是则抛出一个自定义的InvocationCancelException异常。
1: public class InvocationConfirmationInteractiveChannelInitializer : IInteractiveChannelInitializer
2: {
3: public const string ConfirmMessage = "程序执行过程涉及到WCF服务调用,是否继续?";
4: public IAsyncResult BeginDisplayInitializationUI(IClientChannel channel, AsyncCallback callback, object state)
5: {
6: bool cancel = MessageBox.Show(ConfirmMessage, "WCF服务调用确认", MessageBoxButtons.YesNo) == DialogResult.No;
7: return new SimpleAsynsResult(cancel);
8: }
9:
10: public void EndDisplayInitializationUI(IAsyncResult result)
11: {
12: SimpleAsynsResult asyncResult = (SimpleAsynsResult)result;
13: if((bool)asyncResult.AsyncState)
14: {
15: throw new InvocationCancelException("WCF服务调用被取消");
16: }
17: }
18: }
19:
20: public class SimpleAsynsResult:IAsyncResult
21: {
22: public SimpleAsynsResult(object state)
23: {
24: this.AsyncState = state;
25: }
26:
27: public object AsyncState { get; private set; }
28: public WaitHandle AsyncWaitHandle { get; private set; }
29: public bool CompletedSynchronously
30: {
31: get { return true; }
32: }
33: public bool IsCompleted
34: {
35: get { return true; }
36: }
37: }
我们通过一个自定义的ContractBehavior(InvocationConfirmationBehaviorAttribute )将上面自定义的InvocationConfirmationInteractiveChannelInitializer应用到客户端运行时。如下面的代码片断所示,在实现的ApplyClientBehavior方法中,我们创建了一个InvocationConfirmationInteractiveChannelInitializer对象并将其添加到客户端运行时的InteractiveChannelInitializers集合中。
1: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
2: public class InvocationConfirmationBehaviorAttribute : Attribute, IContractBehavior
3: {
4: public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }
5: public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
6: {
7: clientRuntime.InteractiveChannelInitializers.Add(new InvocationConfirmationInteractiveChannelInitializer());
8: }
9: public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) { }
10: public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) { }
11: }
以特性形式定义的InvocationConfirmationBehaviorAttribute直接以如下的方式直接应用到作为服务契约的ICalcualtor接口中:
: [ServiceContract(Name = "CalculatorService", Namespace ="http://www.artech.com/")]
2: [InvocationConfirmationBehavior]
3: public interface ICalculator
4: {
5: [OperationContract]
6: double Add(double x, double y);
7: }
那么在进行服务调用的时候,确认对话框会自动弹出来。如果用户选择终止当前服务调用,那么InvocationCancelException异常会被抛出来,我们只需要捕捉该类型的异常即可。如下所示的是“=”按钮的Click事件代码:
1: public partial class Form1 : Form
2: {
3: //其他成员
4: private void buttonCalculate_Click(object sender, EventArgs e)
5: {
6: this.textBoxResult.Text = string.Empty;
7: using (ChannelFactory<ICalculator> channelfactory = new ChannelFactory<ICalculator>("calculatorservice"))
8: {
9: ICalculator calculator = channelfactory.CreateChannel();
10: try
11: {
12: double op1 = double.Parse(this.textBoxOp1.Text);
13: double op2 = double.Parse(this.textBoxOp2.Text);
14: double result = calculator.Add(op1,op2);
15: this.textBoxResult.Text = result.ToString();
16: }
17: catch (InvocationCancelException)
18: {
19: }
20: catch (Exception ex)
21: {
22: MessageBox.Show(ex.Message);
23: }
24: }
25: }
26: }
1: public class InvocationConfirmationInteractiveChannelInitializer : IInteractiveChannelInitializer
2: {
3: public const string ConfirmMessage = "程序执行过程涉及到WCF服务调用,是否继续?";
4: public IAsyncResult BeginDisplayInitializationUI(IClientChannel channel, AsyncCallback callback, object state)
5: {
6: bool cancel = MessageBox.Show(ConfirmMessage, "WCF服务调用确认", MessageBoxButtons.YesNo) == DialogResult.No;
7: return new SimpleAsynsResult(cancel);
8: }
9:
10: public void EndDisplayInitializationUI(IAsyncResult result)
11: {
12: SimpleAsynsResult asyncResult = (SimpleAsynsResult)result;
13: if((bool)asyncResult.AsyncState)
14: {
15: throw new InvocationCancelException("WCF服务调用被取消");
16: }
17: }
18: }
19:
20: public class SimpleAsynsResult:IAsyncResult
21: {
22: public SimpleAsynsResult(object state)
23: {
24: this.AsyncState = state;
25: }
26:
27: public object AsyncState { get; private set; }
28: public WaitHandle AsyncWaitHandle { get; private set; }
29: public bool CompletedSynchronously
30: {
31: get { return true; }
32: }
33: public bool IsCompleted
34: {
35: get { return true; }
36: }
37: }
转 如何在调用WCF服务之前弹出一个确认对话框的更多相关文章
- asp.net在后台弹出confirm确认对话框并获取用户选择的值做出相应的操作
在asp项目中,这种情况是经常出现的,前段时间通过查找资料以及自己尝试,找到一种解决方案,但是不知是否有更好的方案,以后发现再进行记录. 一.思路 在本次项目中,在一个函数中需要让用户判断,并根据用户 ...
- Android 如何监听返回键,弹出一个退出对话框
android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...
- datagrid点删除,弹出一个确认和取消的消息框
有个简单的方法:在datagrid的删除按扭datagrid的属性生成器->列->添加按扭列->删除在数据字段中加上:<div id="de" onclic ...
- 确认框的使用。弹出一个确认框,Ajax提交一个请求,刷新页面。
视图: <td> @if (item.ReviewProject.DeclareState == DeclareOrReviewState.正在进行 && !item.Is ...
- [转]Android 如何监听返回键,弹出一个退出对话框
本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用 ...
- VS2010中使用Jquery调用Wcf服务读取数据库记录
VS2010中使用Jquery调用Wcf服务读取数据库记录 开发环境:Window Servere 2008 +SQL SERVE 2008 R2+ IIS7 +VS2010+Jquery1.3.2 ...
- ajax内调用WCF服务
WCF可以当作WebService一样被调用,在html内通过ajax调用WCF服务的方法如下: 1.新建一个WCF服务的网站项目: 2.在项目内增加一个新项:启用了ajax的WCF服务: 3.在对应 ...
- 完全使用接口方式调用WCF 服务
客户端调用WCF服务可以通过添加服务引用的方式添加,这种方式使用起来比较简单,适合小项目使用.服务端与服务端的耦合较深,而且添加服务引用的方式生成一大堆臃肿的文件.本例探讨一种使用接口的方式使用WCF ...
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...
随机推荐
- Java中定义不了可变长数组怎么办---集合 泛型
一.集合(Collections) Java使用集合来组织和管理对象. 1.Java的集合类 集合类主要负责保存.盛装和管理对象,因此集合类也被称为容器类. 集合类分为Set.List.Map和Que ...
- mysql 提示ssl问题
问题信息如下: rements SSL connection must be established by default if explicit option isn't set. For comp ...
- forEach, map, filter方法区别
听说for循环已经成了菜鸟标配...? 瑟瑟发抖 赶紧找来资料补一补 1, forEach循环,循环数组中每一个元素并采取操作, 没有返回值, 可以不用知道数组长度 2, map函数,遍历数组每个元素 ...
- Monkey框架(基础知识篇) - monkey事件介绍
Monkey所执行的随机事件流中包含11大事件,分别是触摸事件.手势事件.二指缩放事件.轨迹事件.屏幕旋转事件.基本导航事件.主要导航事件.系统按键事件.启动Activity事件.键盘事件.其他类型事 ...
- 删除N天前的log日志文件:RollingFileAppender,DailyRollingFileAppender,/etc/cron
1. 如果您使用的是Log4j,且采用的RollingFileAppender方式, 通过设置maxBackupIndex属性来指定要保留的日志文件数的最大值可以间接实现删除N天前的日志文件. 2. ...
- IDEA版本控制忽略文件或目录
写在前面 废话不多说了, 新创建了个helloworld, 见图: 这谁受得了啊 修改配置 在上图红框内部的后面添加: *.iml;*.idea;*.gitignore;*.sh;*.classpat ...
- C# redis客户端帮助类
需要在NuGet里面引用ServiceStack.Redis using ServiceStack.Redis; using ServiceStack.Redis.Generic; using Sys ...
- PID:我应该何时计算积分项?
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- css几个优先级测试和!important
css样式不加!important情况下的有默认优先级 ,用!important提高优先级,最常见的css样式选择器的优先级测试.之前博文里也用到了提升优先级的方法: 测试结果:加了!importan ...
- [LeetCode] 61. Rotate List 旋转链表
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...