使用 IErrorHandler 和 TCP Message Security 导致超时

2024-01-18

我有一个附加了自定义 IServiceBehavior 的 WCF 服务,用于在客户端返回特定错误。当我使用 TCP Message Security 启用此代码时,我收到服务超时。

您可以在下面看到重现错误的完整客户端和服务器代码。

服务器代码:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;

namespace TestWCFServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("SERVER");

            NetTcpBinding binding = new NetTcpBinding();
            binding.Security.Mode = SecurityMode.Message; //If you remove this line the code works!!!!

            Uri address = new Uri("net.tcp://localhost:8184/");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService)))
            {
                host.AddServiceEndpoint(typeof(IHelloWorldService), binding, address);

                host.Description.Behaviors.Add(new MyErrorhandlerBehavior());

                host.Open();

                Console.WriteLine("The service is ready at {0}", address);
                Console.WriteLine("Press  to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }



    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            if (name == null)
                throw new ArgumentNullException("name");

            return string.Format("Hello, {0}", name);
        }
    }

    class MyErrorhandlerBehavior : IServiceBehavior, IErrorHandler
    {
        #region IServiceBahvior
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection endpoints, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
            {
                chanDisp.ErrorHandlers.Add(this);
            }
        }

        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
        }
        #endregion

        #region IErrorHandler Members
        public bool HandleError(Exception error)
        {
            return true;
        }

        public void ProvideFault(Exception error,MessageVersion ver, ref Message msg)
        {
            FaultException fe = new FaultException(error.Message);
            MessageFault fault = fe.CreateMessageFault();
            msg = Message.CreateMessage(ver, fault, "net.tcp://localhost:8184/fault");
        }
        #endregion
    }
}
  

客户端代码:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

namespace TestWCFClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("CLIENT");

            try
            {
                NetTcpBinding binding = new NetTcpBinding();
                binding.Security.Mode = SecurityMode.Message; //If you remove this line the code works!!!!

                Uri address = new Uri("net.tcp://localhost:8184/");
                EndpointAddress endpoint = new EndpointAddress(address);

                HelloWorldServiceClient client = new HelloWorldServiceClient(binding, endpoint);

                Console.WriteLine("Calling client with a valid parameter...");
                Console.WriteLine(client.SayHello("Davide"));
                Console.WriteLine("OK");

                Console.WriteLine("Calling client with an invalid parameter...");
                Console.WriteLine(client.SayHello(null)); //This call causes the timeout when Security is set to Message
                Console.WriteLine("OK");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
    }


    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    class HelloWorldServiceClient : System.ServiceModel.ClientBase, IHelloWorldService
    {
        public HelloWorldServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address) :
            base(binding, address)
        { }

        public string SayHello(string name)
        {
            return base.Channel.SayHello(name);
        }
    }
}
  

如果我删除binding.Security.Mode = SecurityMode.Message;客户端和服务器上的行都已正确翻译异常,并且客户端可以毫无问题地看到它。

在 WCF 日志上我看到以下消息:
没有为具有“net.tcp://localhost:8184/fault”操作的消息指定签名消息部分。
安全协议无法保护传出消息的安全。

关于如何解决这个问题有什么想法吗?似乎我必须签署/加密错误消息,但我不知道如何......
如果我使用传输安全性,代码将按预期工作。

thanks!


回复可能有点晚了,但我遇到了同样的问题,并且我找到了答案:

你需要定义FaultContract在你的接口方法上OperationContract。看一看here http://msdn.microsoft.com/en-us/library/ms752208.aspx.

此外,您的故障契约对象需要具有与 Action 命名空间相同的命名空间。

太痛苦了,但现在终于弄清楚并且可以工作了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IErrorHandler 和 TCP Message Security 导致超时 的相关文章

  • 为什么在这里使用BeginInvoke?

    我正在研究其他人的代码 并且对与多线程有关的任何事情没有太多经验 我遇到了这行代码 BeginInvoke MethodInvoker delegate btnCalibrate PerformClick 我想知道为什么要这样做 因为这样就
  • MEF 或 MEF2 是否已融入 .NET Framework 中?

    我正在尝试了解 MEF 并且看到对 MEF 和 MEF 2 的引用 This site http www palmmedia de blog 2011 8 30 ioc container benchmark performance com
  • 在 Roslyn 分析器中检查表达式类型的正确方法?

    我正在用 Roslyn 编写一个代码分析器 我需要检查是否ExpressionSyntax属于类型Task or Task
  • 选择 Enum 类型的默认值而无需更改值

    在 C 中 是否可以用属性修饰 Enum 类型或执行其他操作来指定默认值 而不更改值 无论出于何种原因 所需的数字可能是一成不变的 并且仍然可以控制默认值会很方便 enum Orientation None 1 North 0 East 1
  • 通过 Active Directory 搜索进行有效分页

    在 NET 中使用 Active Directory 搜索进行分页的有效方法是什么 在 AD 中进行搜索的方法有很多 但到目前为止我找不到如何有效地进行搜索 我希望能够表明Skip and Take参数并能够检索结果中与我的搜索条件匹配的记
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • GridView必须添加到表单标签中才能渲染

    TextWriter tr new StringWriter HtmlTextWriter writer new HtmlTextWriter tr HtmlForm form new HtmlForm form Controls Add
  • 数据绑定问题,请解释

    public partial class Form1 Form MyClass myClass new MyClass one two public Form1 InitializeComponent textBox1 DataBindin
  • 如何将 Activator.CreateInstance 与字符串一起使用?

    在我的反射代码中 我的通用代码部分遇到了问题 特别是当我使用字符串时 var oVal object Test var oType oVal GetType var sz Activator CreateInstance oType oVa
  • 使用 WaitHandle.WaitAll 时是否可以对 ThreadPool 中的任务进行分组/隔离?

    我面临的情况如下 因为 ThreadPool 每个进程有 1 个实例 所以我的问题是方法 1 会在 3 秒后取消按方法 2 排队的任务 http请求进来 method 1 gets executed first ThreadPool Que
  • 如何使用反应式扩展同时读取交错文件

    我是反应式扩展的新手 我想使用它 在 c 中 来读取包含多个交错流的文件 基本上文件的格式是ABCDABCDABCD 我更喜欢按顺序读取文件并分离流 即AAA BBB 等 并并行处理每个流 为每个流使用单独的线程 必须有某种形式的缓冲来确保
  • .net 应用程序中的内存泄漏

    我正在 VB net 2005 中开发一个桌面应用程序 该应用程序包含一个间隔为 1 分钟的计时器 每次计时器计时 就会执行一组函数 大部分与数据库相关 最初 应用程序运行良好 在进程 任务管理器 中 每次调用计时器时 CPU 使用率都会达
  • 从 SortedList 或 SortedDictionary 获取第 i 个值

    我有一个排序的对象集合 它可以是 SortedList 或 SortedDictionary 我将主要使用它来阅读 因此增加性能并不那么重要 我怎样才能得到第i个值 所以例如当我的集合中有数字 1 2 3 4 5 并且我想要中位数 本例中为
  • .NET Core 3 是否支持 TLS 1.3

    我正在使用 NET Core 3 0 制作仅支持 TLS 1 3 的代理 我看到 SslProtocols 中定义了 Tls13 12288 但在我的测试过程中 它只抛出异常 客户端和服务器无法通信 因为它们不具备通用算法 所以我的问题是
  • 多线程调试技术

    我想知道是否有人知道多线程应用程序调试技术的一个很好的调查 理想情况下 我正在寻找基于案例的分析 死锁 饥饿 损坏的共享状态 Net 特定的或通用的 我不知道有哪篇文章或书籍可以满足您的需求 因此这是我从 12 年 Windows 多线程调
  • 执行鼠标单击而不移动光标

    除了移动光标之外 我找不到任何解决方案Cursor类 点击mouse event然后将光标移动到原来的位置 我正在玩SendInput现在可以运行 但仍然没有机会找到好的解决方案 有什么建议吗 您应该使用 Win32 API 使用 user
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 使用 apachesoap:使用 .net 在 Web 服务中映射复杂数据类型

    我有一个用 Coldfusion 编程的 Web 服务 我试图使用 c net 来使用它 特定的 Web 服务返回一个 Coldfusion 结构 具有键和值的项目的集合 该结构由 Web 服务公开为 apachesoap Map 类型的复
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd

随机推荐

  • 从后台重新启动应用程序后 iAds 加载受到限制(也发生在 iAdSuite 中)

    我正在努力实施NavigationBanner iAdSuite示例到我的项目中 以便我可以共享一个AdBannerView跨多个视图控制器的实例 但我不断收到以下错误 错误域 ADErrorDomain代码 2 操作无法完成 加载受到限制
  • 构建 Eclipse 项目时自动运行 JUnit

    我想在保存 Eclipse 项目时自动运行单元测试 每当我保存文件时 该项目就会自动构建 所以我认为这应该以某种方式实现 我该怎么做 是获取 ant 脚本并更改项目构建以使用带有目标的 ant 脚本的唯一选择build and compil
  • 我可以从 ASP.NET 页面下载由内存流生成的 Excel 文件吗?

    我有一个 ASP NET 页面 用户在其中提供 ID 然后我们从数据库中提取一些数据并将其放入 Excel 电子表格中 我想在内存中创建 Excel 文件 然后允许用户下载该文件 我可以在服务器上创建一个文件 然后删除它 但这似乎没有必要
  • 为什么我会收到 NoClassDefFoundError: java/awt/Desktop?

    我正在尝试打开一个URI使用 Swing 我得到了上述错误 原因是什么以及如何解决 当我在控制台中执行此操作时 一切正常 但当我在 GUI 中执行此操作时 出现此错误 我应该说我使用Weblogic作为服务器 Code private st
  • 基于列将两个 pandas DataFrame 相乘

    如果我有两个 DataFrame 如何将它们按列相乘以生成包含结果的 DataFrame 例如 df1 pd DataFrame np random randint 10 size 5 4 columns A B C D A B C D 0
  • 将 initWithNibName 与故事板结合使用

    下面是将 initWithNibName 与单独的 xib 视图一起使用的示例 TerminalViewController ctrl TerminalViewController alloc initWithNibName Control
  • 将现有项目转换为 Silverlight 4 时出现问题

    我们有一个正在运行的 Silverlight 3 项目 将目标框架更改为 Silverlight 4 后 应用程序将不再启动 它在生成的 InitializeComponent 方法中的以下行中引发异常 System Windows App
  • ExtJS 4 动态更改网格存储

    是否可以在 ExtJS 4 中更改网格存储 例如 我有两个模型 User Ext define User extend Ext data Model hasMany Product Product Ext define Product ex
  • 从 Rails3 项目中卸载 gem 的最佳方法是什么?

    我通过 Gemfile 使用捆绑器安装了所有 gem 我 错误地 认为 如果我从 Gemfile 中删除了一个 gem 并运行 捆绑安装 则删除的 gem 将被卸载 我查看了捆绑程序帮助文件 据我所知 它没有卸载 gem 的方法 我是否只使
  • GNU 屏幕没有响应,似乎被阻止

    GNU 屏幕似乎冻结了 无法输入用户输入 我正在使用 GNU 屏幕 当我按下屏幕时 它变得没有响应 我可以执行所有 GNU 屏幕命令 但无法输入用户输入 我不想关闭这个屏幕 因为我有重要的工作 我不想失去它 In the commands
  • 设置查询以搜索 dojo 数据网格的所有字段

    我有一个包含多个字段的 Dojo DataGrid 我目前正在将查询设置为一次搜索一个字段 如下所示 grid setQuery name Bob ignoreCase true 但是我希望查询能够立即搜索所有字段 例如 假设我有三个标题为
  • 关于 .shuffle、.batch 和 .repeat 的 Tensorflow 数据集问题

    我有一个关于使用 tf Dataset 进行批处理 重复和随机播放的问题 我不清楚如何使用重复和随机播放 我明白那个 batch将决定有多少训练样本将经历随机梯度下降 使用 repeat and shuffle我仍然不清楚 第一个问题 即使
  • Page.IsValid 是如何工作的?

    我有以下代码RequiredFieldValidator The EnableClientScript属性在验证控件中设置为 false 我还在浏览器中禁用了脚本 我没有使用Page IsValid在后面的代码中 不过 当我在文本框中没有任
  • 在 WordPress 中按日期对帖子进行分组

    我需要编写一个 WordPress 查询来完成以下任务 我正在一个每天有 40 50 个帖子的网站上工作 我想显示按日期 分组 的帖子 e g 20 March 2012 post 1 post 2 post 3 19 March 2012
  • PostgreSQL 索引中的重复键

    我想将 OwnCloud 数据库移动到新服务器 但恢复期间操作失败 pg restore archive program db COPY failed for table oc storages ERROR value of a dupli
  • Pyspark 结构化流处理

    我正在尝试使用 Spark 制作一个结构化流应用程序 主要思想是从 kafka 源中读取 处理输入 写回到另一个主题 我已经成功地使 Spark 从 kafka 读取和写入 但是我的问题在于处理部分 我已经尝试使用 foreach 函数来捕
  • 如何正确查询 ManyToManyField 中列表(或另一个 ManyToManyField)中的所有对象?

    我对构建 Django 查询来检查是否的最佳方法感到困惑alla 的元素ManyToMany字段 或列表 存在于另一个字段中ManyToMany field 举个例子 我有几个Persons 可以拥有不止一种专长 还有Job人们可以开始 但
  • Google Cloud Dataflow 中的自动缩放功能未按预期工作

    我正在尝试在我的数据流作业中启用自动缩放 如中所述本文 https cloud google com dataflow service dataflow service desc autoscaling 我通过以下代码设置相关算法来做到这一
  • 使用 Google Maps API 添加标记功能

    我有以下 Javascript 其中包括标准 Google 地图 APIinitialize 功能与定制addMarker 功能 地图将正常加载 但标记不会添加到地图中
  • 使用 IErrorHandler 和 TCP Message Security 导致超时

    我有一个附加了自定义 IServiceBehavior 的 WCF 服务 用于在客户端返回特定错误 当我使用 TCP Message Security 启用此代码时 我收到服务超时 您可以在下面看到重现错误的完整客户端和服务器代码 服务器代