问题标签 [servicehost]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
539 浏览

wcf - 处理 ServiceHostFactory.CreateServiceHost 故障的正确方法是什么?

我有一些 WCF 服务已经测试了一段时间了。我们使用 Windows Process Activation Services (WAS) 将它们托管在 IIS 中。当客户连接时,服务就会启动,我们很高兴。

现在,像我一样偏执,在我们发布这个东西之前,我想测试一系列与服务如何处理某些类型的故障相关的边缘案例。其中一项实验涉及为特定服务创建 ServiceHost 本身期间的失败。

我们有一个自定义的 ServiceHostFactory(派生自 ServiceHostFactoryBase),它执行一些初始化工作并返回一个完全配置的服务主机。我正在模拟一个配置错误,该错误会导致 CreateServiceHost 在初始化期间引发 ServiceActivationException。我们还记录异常。

[顺便说一句,当我们的客户看到这个异常时,他们会停止尝试访问该服务(假设如果它第一次未能激活,则需要人工参与)。这与例如 EndpointNotFoundException 不同,在这种情况下,客户端会定期尝试,假设网络条件是瞬态的。]

我们看到的是客户端尝试(一次)打开服务的通道。ServiceHostFactory 似乎在几秒钟内多次尝试激活服务,每次尝试都失败并显示预期的异常消息,然后应用程序池似乎只是锁定了。对该应用程序池中运行的其他服务(已成功激活)的调用将永远挂起。

这似乎很奇怪。我不介意在几次尝试激活失败后,失败的服务会从应用程序池中启动,但杀死其他服务似乎是错误的。请注意,应用程序池不会回收或停止——它只是坐在那里不响应对任何服务操作的请求。

我还应该做些什么来告诉 WCF 未能激活一项服务应该使该服务“脱机”但允许应用程序池中的其他服务继续处理请求?还是我错过了 WAS 更基本的东西?

0 投票
1 回答
765 浏览

wcf - 使用具有多重绑定的 ServiceHostFactory 的 WCF 服务主机

我已经创建了 WCF 服务来托管在 IIS 上。我正在使用 ServiceHostFactory 方法来托管我的服务(使用 Unity 作为 DI)。

我想通过 HTTP 和 TCP 使用多重绑定来托管我的服务。

我尝试给出基地址,但它没有。仍然给我错误,因为服务注册了 HTTP 模式。

下面的代码片段可能会给你和想法。

配置文件:

谁能建议我可以做什么?

主要问题,是否可以使用具有多重绑定的 ServiceHostFactory 来托管服务?

如果是,任何人都可以帮助我吗?

0 投票
0 回答
435 浏览

wcf - Ninject WCF 扩展与现有的 ServiceHostFactory 和 ServiceHost

我们很难使用 Ninject wcf 扩展。我们在 IIS 中托管我们的服务并使用 svc 文件。我们已经阅读了很多描述NinjectServiceHostFactory(在 svc 文件中)与NinjectHttpApplication(在global.asax文件中)的用法的帖子,看起来很简单。我们的问题是我们已经有了自定义ServiceHostFactoryServiceHost.

有人能指出我们结合我们的正确方法ServiceHostFactoryNinjectServiceHostFactory

我们的 svc 文件指向我们自定义的ServiceHostFactory.

更新

看来我们设法实现了它。我们的 ServiceHostFactory 实现:

我们的 ServiceHost 实现:

0 投票
4 回答
5629 浏览

wcf - 尝试运行 WCF 服务时出现 WcfSvcHost.exe 错误

当我尝试在 Visual Studio 2012 中运行我的 wcf 时,我收到以下错误

用法:WcfSvcHost.exe /service:<PathToServiceDLL> /config:<PathToServiceConfig> [/client:<pathToClientApp>][/clientArgs:<argumentsToBePassedToClientApp>]

我读过一些博客,这些博客暗示环境可能有问题,但我可以成功运行不同的项目。

我的 app.config文件重要设置:

我在另一个项目中的svc文件:

我不确定我可能会错过什么。

0 投票
2 回答
3136 浏览

c# - WCF 服务最佳实践使我的服务保持活力

我的 WPF 应用程序中有几个 WCF 服务,我使用这种方法打开它们:

服务属性是:

这些服务是日志服务和事件服务,它们从其他进程收到许多调用。我使用命名管道,因为它是最快的并且进程在同一台计算机上运行。

我的问题是 - 我如何保持这些服务一直处于运行状态?

  1. 轮询计时器,迭代 _wcfServicesHolder 并检查服务是否已打开
  2. 登录 serviceHost.Faulted 事件。

并且在服务处于故障状态后,是否必须重新创建客户端(在不同的进程上)?或者它仍然可以在同一频道上广播消息?

我收到的例外是:

0 投票
1 回答
609 浏览

c# - 如何在 app.config 中将 ErrorHandler 添加到我的 EndpointBehaviour

所以我用 Spring.net 代理对象建立了一些 ServiceHost,一切都很好。我现在想在 xml 中添加一个自定义错误处理程序。如有必要,我可以在春天站起来,但我不知道如何做到这一点。我的 app.config 如下:

我发现如何在代码中做到这一点:

谁能帮我?

0 投票
2 回答
836 浏览

c# - 从 ServiceHost 设置变量

在我的项目中,我有一个服务类。

使用这个类,我设置ServiceHost如下:

可能已经很清楚了,我创建了CentralLogic该类的一个实例。这个实例不仅在 UI 中使用,而且在主机中用于管理我的解决方案中的其他内容。

我现在遇到的问题是在-class (或 )中设置centralLogic-variable 。我不知道该怎么做。我已经阅读了有关插件 Ninject 以及如何在服务中注入对象的信息,但这超出了我的范围,我不禁想到有一个简单的方法。KLAServicehost

我怎样才能最好地实现我的目标?

编辑:提出的另一个解决方案是启动 ServiceHost 并CentralLogic在那里创建,而不是相反。这意味着 ServiceHost 需要某种构造函数。我不知道最佳实践是什么,也不知道如何实现这一目标。任何帮助表示赞赏。

0 投票
1 回答
2554 浏览

c# - 具有 DI 和 InstanceContextMode.Percall 的自定义 ServiceHost

在我的托管应用程序中,我目前的 WCF 服务运行为:

有什么问题?SomeService 定义为:

这已经不好了,我需要将其设为InstanceContextMode.PerCall

当尝试 .Open() 如果将 InstanceContextMode 更改为“PerCall” - 它会抛出:

这是我的问题的解决方案吗?如何将值传递给我的 wcf 服务的构造函数?

我主要关心的是:
我在这个托管应用程序中运行不同类型的服务,看来这个解决方案只有在我运行一种类型的服务时才是好的。

0 投票
2 回答
9827 浏览

c# - 无法启动 wcf 服务主机

我正在尝试为我的 WCF 应用程序创建服务主机。当我启动应用程序时,我收到一条错误消息

服务无法启动。该服务没有定义端点。请在配置文件中为服务添加至少一个端点,然后重试。

我按照 PluralSight 上的教程进行操作,这是我想出的代码

IPeopleService.cs

人员服务.cs

应用程序配置

servicelibrary 的 app.config

0 投票
1 回答
4070 浏览

c# - 异步 WCF 自托管服务

我的目标是实现一个异步自托管 WCF 服务,它将在单个线程中运行所有请求并充分利用新的 C# 5 异步功能。

我的服务器将是一个控制台应用程序,我将在其中设置一个SingleThreadSynchronizationContext,如此处指定,创建并打开一个ServiceHost,然后运行SynchronizationContext,因此所有 WCF 请求都在同一个线程中处理。

问题是,尽管服务器能够成功处理同一线程中的所有请求,但异步操作正在阻塞执行并被序列化,而不是交错。

我准备了一个简化的示例来重现该问题。

这是我的服务合同(服务器和客户端相同):

服务实现如下(稍微简化了一点,但最终实现可能会访问数据库,甚至以异步方式调用其他服务):

该服务托管在控制台应用程序中:

如您所见,我做的第一件事是设置一个单线程SynchronizationContext. 接下来,我创建、配置和打开一个 ServiceHost。根据这篇文章,由于我在创建 SynchronizationContext 之前设置了它,因此ServiceHost将捕获它并且所有客户端请求都将发布在SynchronizationContext. 在序列中,我SingleThreadSynchronizationContext在同一个线程中启动。

我创建了一个测试客户端,它将以一种即发即弃的方式调用服务器。

当我执行示例时,我得到以下结果:

客户

在此处输入图像描述

服务器

在此处输入图像描述

消息由客户端以最小间隔 (< 1s) 发送。我希望服务器会收到第一个调用并在SingleThreadSynchronizationContext(queueing a new WorkItem。当到达await关键字时,SynchronizationContext将再次捕获 ,将继续发布给它,并且该方法此时将返回一个 Task ,释放处理SynchronizationContext第二个请求(至少开始处理它)。

从服务器日志中的线程 id 可以看出,请求已正确发布在SynchronizationContext. 但是,查看时间戳,我们可以看到第一个请求在第二个请求开始之前完成,这完全违背了拥有异步服务器的目的。

为什么会这样?

实现 WCF 自托管异步服务器的正确方法是什么?

我认为问题出在 SingleThreadSynchronizationContext 上,但我看不出如何以任何其他方式实现它。

我研究了这个主题,但我找不到更多关于异步 WCF 服务托管的有用信息,尤其是使用基于任务的模式。

添加

这是我的SingleThreadedSinchronizationContext. 与文章中的基本相同: