问题标签 [wcf-sessions]

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 投票
4 回答
2536 浏览

.net - 在来自不同客户端的调用之间未清除 WCF AuthorizationContext。(是:WCF 服务会话何时真正结束?)

我正在做一些单元测试,并在 WCF 中遇到了一个有趣的问题。我有一个使用 的服务wsHttpBinding,配置如下:

该服务的实现是:

它在这里所做的只是检查操作上下文,如果 AuthorizationContext 中没有“X”,则添加一个。如果已经有一个“X”,则异常。(这被严格设置为一个简单的测试。在正常使用中,这将在自定义 AuthorizationManager 和 Token Authenticator 中发生)。

所以基本上,如果我们在同一个 operationContext 和 AuthorizationContext 中多次调用该方法,那么我们会看到一个异常。

现在,这是我的测试夹具。

因此,浏览运行时发生的情况:

  1. 一个新TestBusinessClient的被创建。
  2. 它调用DoWork().
  3. DoWork()在 中找不到“X” AuthorizationContext.Properties
  4. DoWork()将“X”添加到AuthorizationContext.Properties.
  5. 测试方法处理第一个客户端。
  6. 新的第二个TestBusinessClient被创建。
  7. 它调用DoWork().
  8. DoWork() 确实在上次调用的属性中找到“X”。
  9. DoWork()抛出异常。

所以我的问题是;当新客户端连接到同一服务时,为什么OperationContextandAuthorizationContext没有被杀死?我确实理解wsHttpBinding默认情况下在调用之间使用会话上下文,但我认为会话将​​是每个客户端的。当我连接到客户端的新实例时,我希望 WCF 会话及其上下文全部更新。

任何人有任何想法或想法?此处所需的结果是在两个单独的客户端AuthorizationContext.Properties的两次调用之间重置。DoWork()


更新 1

我尝试设置服务PerCallPerSession,但都没有改变。

我还尝试了开启和关闭可靠消息传递的服务,但都没有改变任何东西。

我还在第一次调用和第二次调用时保存了我的 operationContext,并比较了两者:

因此,看起来操作上下文已更改/重新创建,但AuthorizationContext在每个后续服务调用中设置相同。


更新 2

这是所有服务器端的东西:

作为健全性检查,我做了以下工作:

  1. 启动 WCF 服务器的一个实例(使用 Cassini/集成 VS 2008 服务器)。
  2. 将测试夹具减少到只有 1 次调用DoWork().
  3. TestDriven.NET在 VS 2008 中运行测试。
  4. .dllNUnit's独立的 GUI 工具打开相同的测试,然后运行它。

第一次测试通过,第二次失败。因此,这似乎是纯粹的服务器端,因为从 2 个不同进程运行相同的服务调用最终会得到相同的AuthorizationContext.

我开始怀疑 WCF 内部的某些东西是否仍然停留在WindowsAuthentication并重用相同的Auth上下文,因为我使用相同的用户名登录到同一个域?我的服务设置为使用自定义AuthorizationManager

在哪里My.Namespace.CustomAuthMgr延伸ServiceAuthorizationManager。如果我在 中设置断点CustomAuthMgr.CheckAccess(),那么在第一次调用时,operationContext.ServiceSecurityContext.AuthorizationContext它是明确的,而在第二次调用时,它包含我在前一次调用中放入的任何内容。这是由 WCF 执行的我自己的代码的第一种方法,因此在授权阶段之前的某些东西正在重新加载我的AuthorizationContext.


更新 3

一些补充信息:为了验证一些事情,我将我的服务实现更改为不再抛出异常,而是返回一个调用次数的计数器,加上当前线程 ID:

然后从NUnitGUI 运行一次测试会导致:

然后我关闭NUnitGUI,重新启动它,然后再次运行测试:

然后我再次关闭NUnitGUI,并TestDriven.NET在 Visual Studio 中运行测试:

所以它肯定会AuthorizationContext在客户端进程之间保持我的状态,但是同一个线程处理每个服务调用,所以可能AuthorizationContext只是线程静态或什么?

不,它与线程无关。我Thread.Sleep(10000);在服务实现中添加了一个,然后NUnit一次运行 2 个 GUI,每个都打印出“2”,但线程 ID 不同:

AuthorizationContext跨线程也是如此。漂亮。

0 投票
1 回答
1546 浏览

.net - WCF:如何检测到 WCF PerSession 服务的新连接?

我有一个将 InstanceContextMode 设置为 PerSession 的自托管 WCF 服务。
如何从主机应用程序检测到我的服务的新客户端连接(会话)并使用该新会话上下文通过其事件观察我的服务?

就像是:

并从我的主机应用程序中能够做到:

0 投票
3 回答
16996 浏览

.net - 如何使用仅传输安全性的 wsHttpBidning 启用 WCF 会话

我目前部署了一个 WCF 服务,并启用了 basicHttpBindings 和 SSL。但是现在我需要启用 wcf 会话(不是 asp 会话),所以我将服务移至 wsHttpBidnings 但未启用会话

我已经设定

但是当我设置

服务合同上写着

合同需要 Session,但 Binding 'WSHttpBinding' 不支持它或未正确配置以支持它。

以下是 WSHttpBinding 的定义

请在这件事上给予我帮助

0 投票
1 回答
376 浏览

c# - 配置 WCF 以使用会话时遇到问题

我在配置 WCF 服务以在会话模式下运行时遇到问题。作为测试,我编写了这个简单的服务:

我正在使用具有默认配置的 Net.TCP 绑定,并启用了可靠会话标志。据我了解,这样的服务应该在会话模式下运行没有问题。但是,该服务以按调用模式运行 - 每次我调用 AddData 时,都会在执行 AddData 之前调用构造函数,并在调用之后调用 Dispose()。任何想法为什么会发生这种情况?也许我错过了什么?

注意:我不知道它是否相关,但我正在使用 VS2008 运行它。

更新:我在这里注意到wcftestclient 不与客户端保持会话 - 也许这是我的问题。确实这就是问题所在。从简单的控制台客户端连接到服务确认服务正常工作。

0 投票
2 回答
24700 浏览

.net - 带有 wsHttpBinding 且没有 Windows 安全性的 WCF 会话

我需要创建一个托管在 IIS 中的 WCF 服务,使用 http 传输并在服务器内存中保持状态。虽然我知道有状态服务不是一个好主意,但最后一个约束对于使服务与旧客户端一起工作是必要的。

我的第一个想法是在 asp.net 的 session 中存储这些值。我在我的服务中激活了 asp.net 兼容模式,这使我可以访问 HttpContext,但放置在会话对象中的值没有保留在内存中。我认为这是因为处理会话状态的 http 模块未正确配置,但是当我在谷歌上搜索答案时,我遇到了 WCF 会话,并认为使用它们可能是一个更好的主意。

但是,WCF 会话似乎在记录下并在服务上放置了一组奇怪的先决条件,而且我无法找到适合我需要的配置:必须托管在 IIS 中,必须使用 http 或 https 传输,并且可以'不回复​​ Windows 身份验证,因为客户端和服务器不会属于同一域。我正在尝试使用 wsHttpBinding 来实现这一点,我听说 WCF 会话需要安全或可靠消息,但是: - 使用标准绑定并且当服务器不属于同一域时,它会失败并显示“SecurityNegotiationException The caller未通过服务验证”异常。这是相当合乎逻辑的,因为它使用的是 Windows 安全性。

  • 如果我禁用安全完成,则会失败并显示“合同需要会话,但绑定 'WSHttpBinding' 不支持它或未正确配置以支持它。”</p>

  • 如果在禁用安全性的同时启用可靠消息,则会收到异常“绑定验证失败,因为 WSHttpBinding 不支持基于传输安全 (HTTPS) 的可靠会话。无法打开通道工厂或服务主机。使用消息安全性通过 HTTP 进行安全可靠的消息传递。”</p>

  • 我已经尝试启用传输级安全性,但这似乎对生成的错误没有任何影响

有没有适合我的配置?还是我应该回到使用 asp.net 会话的计划?

0 投票
1 回答
1862 浏览

wcf - 如何在启用会话的 WCF 双工服务中处理故障状态

我有一个启用了会话的双工 WCF 服务,并且我正在尝试避免客户端上出现故障状态异常。

我发现了围绕这个主题的几个讨论,但我发现的所有内容都建议重新创建客户端代理或通道。Non 专注于启用会话的双工服务。

我对这种方法的问题是服务器中的每个客户端都有一个会话,并且每个客户端只有一个服务代理实例(单例服务代理)。因为它是双工的,所以在客户端有几个对象正在监听该服务实例上的事件(从服务器发送到客户端的消息)。如果服务处于故障状态,则不能再使用。如果我丢弃该实例并创建一个新实例,我会发现很难将所有事件处理程序再次连接到这个新实例。

我是否应该包装服务并且每次对象连接到事件时,将处理程序存储在列表中(以便在重新创建服务时重新连接它)?好像丢了代码,容易泄露内存……

有没有办法只重新启动客户端代理/通道,而不丢弃所有代理实例?(我正在使用 VS 生成的代理)

有任何想法吗?

谢谢,MAB

0 投票
1 回答
1076 浏览

wcf - 在同一 WCF 通道或会话上使用多个服务合同

我正在使用 NetTcpBinding 编写双工 WCF 服务,并且遇到了一个体系结构问题,我认为我知道答案,但希望我错了。

我们的服务是有状态的,我们选择了 NetTcpBinding 和PerSession InstanceContextMode. 由于各种原因,这是我们需要的。我正在尝试将我们较大的接口(其中大块操作不适用于许多客户端)分解为多个较小的接口,并将操作按逻辑分组。虽然让一个服务实现实现所有合同很简单,但我不确定是否有可能让多个服务合同共享一个通道(或者,更符合我的要求,一个会话),我会绝对需要能够做到这一点才能完成这项工作。

当然,我可以将所有内容都包含在一个合同中,并FaultException在执行无效操作时抛出 s,但我真的希望能够分解这些内容,甚至不为不适用的合同添加端点。我正在寻找的可能吗?

TL;DR 版本:

我需要能够做到这一点:

并且能够建立从客户端到服务的一个会话,但同时使用IServiceAIServiceB

0 投票
1 回答
674 浏览

azure - Azure appfabric 服务总线负载均衡 + 会话亲和性(粘性会话)

我正在通过 Internet 进行搜索,我发现在 Azure 外部/内部端点上是不可能的...... Windows Azure 如何执行负载平衡?

但我正在寻找的是,服务总线上是否可以使用会话亲和性。我什至做了自己的研究,修改后EchoSample,但没有成功。我已经尝试ws2007HttpRelayBindingnetTcpRelayBinding最终得到:

System.ServiceModel.CommunicationException:远程端点不再识别此序列。这很可能是由于远程端点上的中止。srm:Identifier 的值不是已知的序列标识符。可靠会话出现故障。

那么,问题来了:可以做到“服务总线负载均衡+会话亲和”吗?

0 投票
1 回答
141 浏览

c# - SessionChannel 是如何工作的

从这篇 MSDN 文章中,我一遍又一遍地无法理解我们为什么要使用它以及它是如何工作的:

  1. 带有会话的数据报
  2. 请求-响应会话
  3. 与会话双工

假设我有一个服务

如果我有 2 个用于此服务的客户端,并且他们同时激活了该服务中的一个方法,为什么其中一个要等到服务完成另一个请求?PerSession + 2 个客户端 = 每个都有 ConcurrencyMode.Single 的“2”个服务。我的错误在哪里?

0 投票
0 回答
316 浏览

c# - WPF Endpoint.Address 更改丢失 cookie

我有一个连接到肥皂网络服务的 wpf 应用程序,我需要它连接到该网络服务的任意数量的位置,因此我允许用户在文本框中输入 URL,并将其保存在 Properties.Settings . 然后我将 Endpoint.Address 设置为 url。除了一件事之外,这一切都有效,Web 服务使用 ASP.net 会话来验证应用程序是否已登录,因此将服务设置为允许 cookies = true。我在 Binding 下的 wpf 应用程序的 app.config 中设置了它,但由于某种原因,cookie 没有在任何地方进行管理。当我使用 Fiddler 时,我可以看到 cookie 在服务返回请求中的设置位置,但客户端没有跨 Web 服务方法保存/使用该 cookie。

这确实正确设置了 URL,但同样,我在某处丢失了 cookie,因为请求没有跟踪它并将“ASP.NET_Sessionid”cookie 发送到服务以识别谁在发送此服务请求。任何人都对如何在设置和管理cookie时获取cookie有任何想法?谢谢!