Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >城堡温莎WCF设施不处理单向操作

城堡温莎WCF设施不处理单向操作
EN

Stack Overflow用户
提问于 2014-10-01 12:53:52
回答 1查看 689关注 0票数 2

我目前有一个简单的用例。

1)使用城堡的AsWcfClient选项连接到WCF服务的客户端应用程序。

2) WCF服务"A“,它使用城堡托管,并注入单个依赖项。此依赖项是另一个WCF服务(称为"B")的客户端代理。

3)服务"B“做一些工作。

可视化:客户端->服务"A“,向->服务"B”注入城堡代理

很简单对吧?如果服务"B“主机已经启动并运行,这将是一个很大的假设。

我已经看到并可以按需复制的行为是,如果服务"B“被关闭,那么调用链就会在没有任何提示的情况下完成。换句话说,城堡没有抛出任何解析异常,也没有WCF异常。我将此与IsOneWay=true操作的处理方式隔离开来。

这是一个很大的问题,因为您认为一切都已正确执行,但实际上您的代码都没有被执行过!

这是预期的行为吗?我是否可以在城堡中打开一些选项,以便在WCF客户端代理是已解决的依赖项时抛出和异常?还有别的选择吗?

另一个注意事项是,当/如果您在客户端代理上执行Container.Release()时抛出异常,则会出现问题的唯一线索。这不能取决于你,因为各种原因,不值得进入这里。

谢谢!

此外,下面是重新创建此问题的代码。要运行它,1)在Visual 2中创建一个新的单元测试项目( 2)通过NuGet 3将代码粘贴到.cs文件中,从而使它变得简单。4)运行两个单元测试,SomeOperation_With3Containers_NoException()作为依赖服务(上面的服务"B“)正在运行。SomeOperation_With2Containers_NoException() fails是.Release 5)设置的断点,您可以看到实现中没有命中任何代码。

*UPDATE*:需要处理的主要方法是植入IErrorHandler (如罗曼在下面的注释中提到的)。详细信息和示例可以在这里找到:http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler(v=vs.110).aspx

使用此实现可以记录单向操作上的任何异常,并使用该数据采取适当的操作。

代码语言:javascript
运行
AI代码解释
复制
using Castle.Facilities.WcfIntegration;  
using Castle.MicroKernel.Registration;  
using Castle.Windsor;  
using Microsoft.VisualStudio.TestTools.UnitTesting;  
using System;  
using System.ServiceModel;  
using System.ServiceModel.Description;  

namespace UnitTestProject1
{
    [ServiceContract]
    public interface IServiceContractA
    {  
        [OperationContract(IsOneWay = true)]  
        void SomeOperation();  
    }  

[ServiceContract]
public interface IServiceDependancy
{
    [OperationContract]
    void SomeOperation();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ServiceContractAImplementation : IServiceContractA
{
    private IServiceDependancy ServiceProxy;

    public ServiceContractAImplementation() { }
    public ServiceContractAImplementation(IServiceDependancy dep)
    {
        ServiceProxy = dep;
    }

    public void SomeOperation()
    {
        ServiceProxy.SomeOperation();
    }
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class ServiceDependancyImplementation : IServiceDependancy
{
    public void SomeOperation()
    {
        //do nothing, just want to see if we can create an instance and hit the operation.
        //if we need to do something, do something you can see like: System.IO.File.Create(@"d:\temp\" + Guid.NewGuid().ToString());
    }
}

public class ServiceCastleInstaller : IWindsorInstaller
{
    public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero);

        var returnFaults = new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true, HttpHelpPageEnabled = true };

        container.Register(Component.For<IServiceBehavior>().Instance(returnFaults));


        //local in-proc service hosting
        var namedPipeBinding = new NetNamedPipeBinding();

        //it works using Named Pipes
        var serviceModelPipes = new DefaultServiceModel().AddEndpoints(
            WcfEndpoint.BoundTo(namedPipeBinding).At("net.pipe://localhost/IServiceContractA")
                        ).Discoverable();

        container.Register(Component.For<IServiceContractA>()
                                            .ImplementedBy<ServiceContractAImplementation>()
                                            .LifeStyle.PerWcfOperation()
                                            .AsWcfService(serviceModelPipes)
                                            );

        //our service (IServiceContractA) has a dependancy on another service so needs a client to access it.
        container.Register(Castle.MicroKernel.Registration.Component.For<IServiceDependancy>()
            .AsWcfClient(WcfEndpoint.BoundTo(namedPipeBinding)
            .At(@"net.pipe://localhost/IServiceDependancy")).LifeStyle.Transient);

    }
}

public class ServiceDependancyCastleInstaller : IWindsorInstaller
{
    public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero);

        var returnFaults = new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true, HttpHelpPageEnabled = true };

        container.Register(Component.For<IServiceBehavior>().Instance(returnFaults));

        //local in-proc service hosting
        var namedPipeBinding = new NetNamedPipeBinding();

        var serviceModel = new DefaultServiceModel().AddEndpoints(
            WcfEndpoint.BoundTo(namedPipeBinding).At("net.pipe://localhost/IServiceDependancy")
                        ).Discoverable();

        container.Register(Component.For<IServiceDependancy>()
                                            .ImplementedBy<ServiceDependancyImplementation>()
                                            .LifeStyle.PerWcfOperation()
                                            .AsWcfService(serviceModel)
                                            );
    }

}


[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void SomeOperation_With3Containers_NoException()
    {
        //setup the container that is going to host the service dependancy
        using (var dependancyContainer = new WindsorContainer().Install(new ServiceDependancyCastleInstaller()))
        {
            //container that host the service that the client will call.
            using (var serviceContainer = new WindsorContainer().Install(new ServiceCastleInstaller()))
            {
                //client container, nice and simple so doing it in the test here.
                using (var clientContainer = new WindsorContainer())
                {
                    clientContainer.AddFacility<WcfFacility>();

                    var endpoint = WcfEndpoint.BoundTo(new NetNamedPipeBinding())
                        .At("net.pipe://localhost/IServiceContractA");

                    clientContainer.Register(Castle.MicroKernel.Registration.Component.For<IServiceContractA>()
                        .AsWcfClient(endpoint).LifeStyle.Transient);

                    var proxy = clientContainer.Resolve<IServiceContractA>();

                    proxy.SomeOperation();

                    clientContainer.Release(proxy);
                }
            }
        }
    }

    [TestMethod]
    public void SomeOperation_With2Containers_NoException()
    {
        //this one fails.
        // this test omits the dependancy that the IServiceContractA has
        //Note that all seems to work, the only hint you have that it doesnt
        //is the .Release call throws and exception.

        //container that host the service that the client will call.
        using (var serviceContainer = new WindsorContainer().Install(new ServiceCastleInstaller()))
        {
            //client container, nice and simple so doing it in the test here.
            using (var clientContainer = new WindsorContainer())
            {
                clientContainer.AddFacility<WcfFacility>();

                var endpoint = WcfEndpoint.BoundTo(new NetNamedPipeBinding())
                    .At("net.pipe://localhost/IServiceContractA");

                clientContainer.Register(Castle.MicroKernel.Registration.Component.For<IServiceContractA>()
                    .AsWcfClient(endpoint).LifeStyle.Transient);

                var proxy = clientContainer.Resolve<IServiceContractA>();

                //this call seems like it works but any break points
                //in code don't get hit.
                proxy.SomeOperation();

                //this throws and exception
                clientContainer.Release(proxy);
            }
        }
    }

}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-02 12:03:33

一种方式的操作存在的目的是“火和忘记”的场景。无论结果是否成功,都不关心。您不需要等待来响应服务器(只有初始的TCP握手(如果是HTTP ))。通过使用单向操作,客户端只能确信服务器在有线上成功地接收到了消息,而服务器无法保证它将成功地处理消息。这在HTTP协议中是正确的。在其他协议(如Microsoft或IBM )中,服务器甚至不需要与客户端同时联机。

在您的场景中,客户端不会收到异常,因为服务A已经启动并正在运行。如果服务A被关闭,您将看到一个错误(同样,假设HTTP,或者在您的例子中是.net管道)。服务B的条件并不重要,因为服务B是服务A的实现细节,而您的客户端并不关心服务A的返回值。如果您要在服务B关闭时调试服务A(通过附加到它),那么您将看到第一次机会,甚至可能是未处理的异常(取决于服务A的实现)。

无论如何,城堡都不应该抛出异常,因为它已经成功地解决了服务A中服务B的代理问题,而服务B已关闭这一事实与城堡无关,也与任何其他DI容器无关。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26150471

复制
相关文章
数据挖掘知识脉络与资源整理(九)–柱形图
柱形图 简介 英文:histogram或者column diagram 排列在工作表的列或行中的数据可以绘制到柱形图中。在柱形图中,通常沿水平轴组织类别,而沿垂直轴组织数值。 柱形图具有下列图表子类型
小莹莹
2018/04/25
3.8K0
数据挖掘知识脉络与资源整理(九)–柱形图
R数据可视化之ggplot2 (一)
学完R语言的基本操作后,我们还可以继续学习R的几大著名而且使用强大的包,今天讲其中的一个,就是ggplot2,至于这个包的评价和地位,我就不多说了,感兴趣可以百度,它绝对是数据可视化的利器,好了,我们先来开始简单介绍一下这个包. 先说说我们人手工作图的方式,1,先画一个坐标轴,2,然后根据数据在图上画图形3,在基础的图形上加一些注释,或加一些对比.基本上这就是我们作图的方式,那么ggplot2就跟这差不多了,1.先设定坐标轴和数据2,选择要画图形的类型3,添加一些图形,4,丰富一下图形的信息.ggpl
小莹莹
2018/04/23
2K0
R数据可视化之ggplot2 (一)
R基础知识及快速检阅你的数据
考虑到公众号后台数不胜数的提问其实并不是生物学知识或者数据处理知识的困惑,仅仅是绘图小技巧以及数据转换的困难。所以我们一再强调系统性掌握编程知识的重要性,在这个打基础方面我让实习生“身先士卒”,起码每个人在每个编程语言上面都需要看至少五本书而且每本书都需要看五遍以上,并且详细的记录笔记。
生信技能树
2022/06/08
4K0
R基础知识及快速检阅你的数据
「R」数据可视化4 : 直方图/条形图
本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组。
王诗翔呀
2020/07/06
2.9K0
「R」数据可视化4 : 直方图/条形图
文献配套GitHub发表级别绘图之饼图
ggplot2是R语言最流行的第三方扩展包,是RStudio首席科学家Hadley Wickham读博期间的作品。根据其绘图理念,图形由以下几个模块组成:
生信技能树
2022/03/03
2K0
文献配套GitHub发表级别绘图之饼图
了解绘制条形图和折线图的细节
考虑到公众号后台数不胜数的提问其实并不是生物学知识或者数据处理知识的困惑,仅仅是绘图小技巧以及数据转换的困难。所以我们一再强调系统性掌握编程知识的重要性,在这个打基础方面我让实习生“身先士卒”,起码每个人在每个编程语言上面都需要看至少五本书而且每本书都需要看五遍以上,并且详细的记录笔记。
生信技能树
2022/06/08
7.2K0
了解绘制条形图和折线图的细节
在背景图上面加滤镜层之后添加内容
实现步骤: 第一步,需要一个大容器让图片作为该容器的背景图片。 第二步,再在这个大容器中添加一个二级容器作为滤镜层(指定宽度,高度 ,背景色) 第三步,最后在二级容器中添加需要的的内容 <div class="first_big_bg">//大容器 添加背景 <div class="second_lving">//二级容器 添加滤镜 <div class="myself_content_partial">//自己的内容
wfaceboss
2019/04/08
7980
使括号有效的最少添加
给定一个由(和)括号组成的字符串S,我们需要添加最少的括号(或是),可以在任何位置,以使得到的括号字符串有效。 从形式上讲,只有满足下面几点之一,括号字符串才是有效的:
WindRunnerMax
2020/09/01
4230
R语言绘图之ggplot2包「建议收藏」
6月份一直在忙期末考试,今天来迅速的学习下ggplot2包的简单绘图。 R的基础包里面也有很多画图函数,例如plot();barplot();qqplot(); 但是还有大名鼎鼎的ggplot2包,用这个包的函数画出的图比较漂亮,而且使用灵活。
全栈程序员站长
2022/07/23
2.1K0
R语言绘图之ggplot2包「建议收藏」
Origin绘图之条形图上加曲线拟合图
有时,写论文时,我们要做一些描述性统计,经常用到条形图来表示我们的数据,同时在条形图上可以加入曲线拟合的情况。如下图所示:
全栈程序员站长
2022/08/29
1.4K0
Origin绘图之条形图上加曲线拟合图
双坐标分别绘制条形图和折线图
生信技能树jimmy
2023/09/26
3140
双坐标分别绘制条形图和折线图
腾讯地图JSAPI-在地图上添加自定义覆盖物
在地图上添加覆盖物有两种方式,一是在canvas画布上渲染,比如JSAPI GL绘制MultiMarker/MultiPolygon等矢量图形覆盖物就是通过编写对应图形的数据解析及渲染程序,直接绘制在底图上层。这样的渲染方式下视角变换时图形也可以实现3D形变。另一种方式是通过CSS布局将其他DOM元素叠加到地图容器之上,这种方式下视角变换时DOM元素需重新计算布局,比如JSAPI v2的Marker/Polygon等覆盖物,以及JSAPI GL的InfoWindow信息窗,这些都属于DOM覆盖物。
腾讯位置服务
2020/06/19
3.5K0
(数据科学学习手札37)ggplot2基本绘图语法介绍
  ggplot2是R语言中四大著名绘图框架之一,且因为其极高的参数设置自由度和图像的美学感,即使其绘图速度不是很快,但丝毫不影响其成为R中最受欢迎的绘图框架;ggplot2的作者是现任Rstudio首席科学家的Hadley Wickham,ggplot2基于Leland Wilkinson在Grammar of Graphics(图形的语法)中提出的理论,取首字母缩写再加上plot,于是得名ggplot,末尾的2是因为Hadley写包的一个习惯——对先前的版本不满意便写一个新版本的名称不变仅在末尾加上2,如reshape2等;
Feffery
2018/05/26
7K0
玩转数据地图系列之——地图上的迷你条形图
最近忙的厉害,产量下降的有点严重,感谢各位还没取关的小伙伴儿。 一周前更新了一篇数据地图上的气泡散点图的内容,不知怎地,这段时间就是跟地图死磕上了,今天还是数据地图,不过是在数据地图上呈现条形图、柱形图。 之前的一篇因为有现成的作图包支持,geom_scatterpie函数不用花费太大力气就解决了数据地图上的气泡散点图问题。 可是到目前为止我还没有发现支持对应坐标位置的条形图、柱形图,这一篇是参考了知乎上大神提供的思路。 加载包: library(maptools) library(ggplot2) lib
数据小磨坊
2018/04/11
2.6K1
玩转数据地图系列之——地图上的迷你条形图
今天,你学绘图了吗?
我们都知道条形图通过直的或水平的条形开展型量的分布( 数)。函数barplot()的最简单的用法是: barplot(height),其中的height是一个向量或一个
黑妹的小屋
2020/08/06
1.1K0
这些条形图的用法您都知道吗?
条形图专用于离散变量和数值变量之间的可视化展现,其通过柱子的高低,直观地比较离散变量各水平之间的差异,它被广泛地应用于工业界和学术界。在R语言的ggplot2包中,读者可以借助于geom_bar函数轻松地绘制条形图。对于条形图大家对其的印象是什么呢?又见过哪些种类的条形图呢?在本篇文章我将带着各位网友说道说道有关条形图的哪些品种。
1480
2019/08/05
5.6K0
这些条形图的用法您都知道吗?
ggplot2在图上添加线性拟合方程和R值
今天给大家分享三种在ggplot2包画的图形上添加拟合的线性回归方程和R^2的值的方法。
生信交流平台
2020/09/14
14.8K0
文献配套GitHub发表级别绘图03-条形图
文章来源:"Preoperative immune landscape predisposes adverse outcomes in hepatocellular carcinoma patients with liver transplantation" (2021,npj Precision Oncology),数据与代码全部公开在https://github.com/sangho1130/KOR_HCC。
生信技能树
2022/03/03
1.5K0
文献配套GitHub发表级别绘图03-条形图
LeetCode - 使括号有效的最少添加
原题地址:https://leetcode-cn.com/problems/minimum-add-to-make-parentheses-valid/
晓痴
2019/07/24
4850
LeetCode - 使括号有效的最少添加
课后笔记:ggplot2优雅的显示WB结果
但是学生的表现实在是太超出我意料了,能超脱于现有的工具,达到随心所欲的定制化,值得分享!
生信技能树
2021/07/06
2.6K0

相似问题

Eclipse中的多目标模式错误

33

Eclipse显示错误(无法解析目标)

31

错误显示“无法连接到目标”

15

无法将Sony Xperia L C2104连接到eclipse

80

将SQL Server 2005连接到Eclipse

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文