问题标签 [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.
.net - 在来自不同客户端的调用之间未清除 WCF AuthorizationContext。(是:WCF 服务会话何时真正结束?)
我正在做一些单元测试,并在 WCF 中遇到了一个有趣的问题。我有一个使用 的服务wsHttpBinding
,配置如下:
该服务的实现是:
它在这里所做的只是检查操作上下文,如果 AuthorizationContext 中没有“X”,则添加一个。如果已经有一个“X”,则异常。(这被严格设置为一个简单的测试。在正常使用中,这将在自定义 AuthorizationManager 和 Token Authenticator 中发生)。
所以基本上,如果我们在同一个 operationContext 和 AuthorizationContext 中多次调用该方法,那么我们会看到一个异常。
现在,这是我的测试夹具。
因此,浏览运行时发生的情况:
- 一个新
TestBusinessClient
的被创建。 - 它调用
DoWork()
. DoWork()
在 中找不到“X”AuthorizationContext.Properties
。DoWork()
将“X”添加到AuthorizationContext.Properties
.- 测试方法处理第一个客户端。
- 新的第二个
TestBusinessClient
被创建。 - 它调用
DoWork()
. DoWork()
确实在上次调用的属性中找到“X”。DoWork()
抛出异常。
所以我的问题是;当新客户端连接到同一服务时,为什么OperationContext
andAuthorizationContext
没有被杀死?我确实理解wsHttpBinding
默认情况下在调用之间使用会话上下文,但我认为会话将是每个客户端的。当我连接到客户端的新实例时,我希望 WCF 会话及其上下文全部更新。
任何人有任何想法或想法?此处所需的结果是在两个单独的客户端AuthorizationContext.Properties
的两次调用之间重置。DoWork()
更新 1
我尝试设置服务PerCall
和PerSession
,但都没有改变。
我还尝试了开启和关闭可靠消息传递的服务,但都没有改变任何东西。
我还在第一次调用和第二次调用时保存了我的 operationContext,并比较了两者:
因此,看起来操作上下文已更改/重新创建,但AuthorizationContext
在每个后续服务调用中设置相同。
更新 2
这是所有服务器端的东西:
作为健全性检查,我做了以下工作:
- 启动 WCF 服务器的一个实例(使用 Cassini/集成 VS 2008 服务器)。
- 将测试夹具减少到只有 1 次调用
DoWork()
. TestDriven.NET
在 VS 2008 中运行测试。.dll
从NUnit's
独立的 GUI 工具打开相同的测试,然后运行它。
第一次测试通过,第二次失败。因此,这似乎是纯粹的服务器端,因为从 2 个不同进程运行相同的服务调用最终会得到相同的AuthorizationContext
.
我开始怀疑 WCF 内部的某些东西是否仍然停留在WindowsAuthentication
并重用相同的Auth
上下文,因为我使用相同的用户名登录到同一个域?我的服务设置为使用自定义AuthorizationManager
:
在哪里My.Namespace.CustomAuthMgr
延伸ServiceAuthorizationManager
。如果我在 中设置断点CustomAuthMgr.CheckAccess()
,那么在第一次调用时,operationContext.ServiceSecurityContext.AuthorizationContext
它是明确的,而在第二次调用时,它包含我在前一次调用中放入的任何内容。这是由 WCF 执行的我自己的代码的第一种方法,因此在授权阶段之前的某些东西正在重新加载我的AuthorizationContext
.
更新 3
一些补充信息:为了验证一些事情,我将我的服务实现更改为不再抛出异常,而是返回一个调用次数的计数器,加上当前线程 ID:
然后从NUnit
GUI 运行一次测试会导致:
然后我关闭NUnit
GUI,重新启动它,然后再次运行测试:
然后我再次关闭NUnit
GUI,并TestDriven.NET
在 Visual Studio 中运行测试:
所以它肯定会AuthorizationContext
在客户端进程之间保持我的状态,但是同一个线程处理每个服务调用,所以可能AuthorizationContext
只是线程静态或什么?
不,它与线程无关。我Thread.Sleep(10000);
在服务实现中添加了一个,然后NUnit
一次运行 2 个 GUI,每个都打印出“2”,但线程 ID 不同:
AuthorizationContext
跨线程也是如此。漂亮。
.net - WCF:如何检测到 WCF PerSession 服务的新连接?
我有一个将 InstanceContextMode 设置为 PerSession 的自托管 WCF 服务。
如何从主机应用程序检测到我的服务的新客户端连接(会话)并使用该新会话上下文通过其事件观察我的服务?
就像是:
并从我的主机应用程序中能够做到:
.net - 如何使用仅传输安全性的 wsHttpBidning 启用 WCF 会话
我目前部署了一个 WCF 服务,并启用了 basicHttpBindings 和 SSL。但是现在我需要启用 wcf 会话(不是 asp 会话),所以我将服务移至 wsHttpBidnings 但未启用会话
我已经设定
但是当我设置
服务合同上写着
合同需要 Session,但 Binding 'WSHttpBinding' 不支持它或未正确配置以支持它。
以下是 WSHttpBinding 的定义
请在这件事上给予我帮助
c# - 配置 WCF 以使用会话时遇到问题
我在配置 WCF 服务以在会话模式下运行时遇到问题。作为测试,我编写了这个简单的服务:
我正在使用具有默认配置的 Net.TCP 绑定,并启用了可靠会话标志。据我了解,这样的服务应该在会话模式下运行没有问题。但是,该服务以按调用模式运行 - 每次我调用 AddData 时,都会在执行 AddData 之前调用构造函数,并在调用之后调用 Dispose()。任何想法为什么会发生这种情况?也许我错过了什么?
注意:我不知道它是否相关,但我正在使用 VS2008 运行它。
更新:我在这里注意到wcftestclient 不与客户端保持会话 - 也许这是我的问题。确实这就是问题所在。从简单的控制台客户端连接到服务确认服务正常工作。
.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 会话的计划?
wcf - 如何在启用会话的 WCF 双工服务中处理故障状态
我有一个启用了会话的双工 WCF 服务,并且我正在尝试避免客户端上出现故障状态异常。
我发现了围绕这个主题的几个讨论,但我发现的所有内容都建议重新创建客户端代理或通道。Non 专注于启用会话的双工服务。
我对这种方法的问题是服务器中的每个客户端都有一个会话,并且每个客户端只有一个服务代理实例(单例服务代理)。因为它是双工的,所以在客户端有几个对象正在监听该服务实例上的事件(从服务器发送到客户端的消息)。如果服务处于故障状态,则不能再使用。如果我丢弃该实例并创建一个新实例,我会发现很难将所有事件处理程序再次连接到这个新实例。
我是否应该包装服务并且每次对象连接到事件时,将处理程序存储在列表中(以便在重新创建服务时重新连接它)?好像丢了代码,容易泄露内存……
有没有办法只重新启动客户端代理/通道,而不丢弃所有代理实例?(我正在使用 VS 生成的代理)
有任何想法吗?
谢谢,MAB
wcf - 在同一 WCF 通道或会话上使用多个服务合同
我正在使用 NetTcpBinding 编写双工 WCF 服务,并且遇到了一个体系结构问题,我认为我知道答案,但希望我错了。
我们的服务是有状态的,我们选择了 NetTcpBinding 和PerSession
InstanceContextMode
. 由于各种原因,这是我们需要的。我正在尝试将我们较大的接口(其中大块操作不适用于许多客户端)分解为多个较小的接口,并将操作按逻辑分组。虽然让一个服务实现实现所有合同很简单,但我不确定是否有可能让多个服务合同共享一个通道(或者,更符合我的要求,一个会话),我会绝对需要能够做到这一点才能完成这项工作。
当然,我可以将所有内容都包含在一个合同中,并FaultException
在执行无效操作时抛出 s,但我真的希望能够分解这些内容,甚至不为不适用的合同添加端点。我正在寻找的可能吗?
TL;DR 版本:
我需要能够做到这一点:
并且能够建立从客户端到服务的一个会话,但同时使用IServiceA
和IServiceB
。
azure - Azure appfabric 服务总线负载均衡 + 会话亲和性(粘性会话)
我正在通过 Internet 进行搜索,我发现在 Azure 外部/内部端点上是不可能的...... Windows Azure 如何执行负载平衡?
但我正在寻找的是,服务总线上是否可以使用会话亲和性。我什至做了自己的研究,修改后EchoSample
,但没有成功。我已经尝试ws2007HttpRelayBinding
并netTcpRelayBinding
最终得到:
System.ServiceModel.CommunicationException:远程端点不再识别此序列。这很可能是由于远程端点上的中止。srm:Identifier 的值不是已知的序列标识符。可靠会话出现故障。
那么,问题来了:可以做到“服务总线负载均衡+会话亲和”吗?
c# - SessionChannel 是如何工作的
从这篇 MSDN 文章中,我一遍又一遍地无法理解我们为什么要使用它以及它是如何工作的:
- 带有会话的数据报
- 请求-响应会话
- 与会话双工
假设我有一个服务
如果我有 2 个用于此服务的客户端,并且他们同时激活了该服务中的一个方法,为什么其中一个要等到服务完成另一个请求?PerSession + 2 个客户端 = 每个都有 ConcurrencyMode.Single 的“2”个服务。我的错误在哪里?
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有任何想法?谢谢!