问题标签 [wcf-extensions]
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.
multithreading - WCF Operation.Context 不是线程安全的?
我正在审查 WCF 服务的代码。在每条消息的标头中,我们注入数据,服务稍后将使用这些数据来构建到 DB 的连接字符串。这是因为该服务将被许多不同的站点使用,每个站点都有自己的数据库,该服务必须查询。我们使用 wcf 可扩展性。我们有一个自定义 MessageInspector,它在收到请求后,从消息头中提取数据,创建一个上下文(实现 IExtension)并将其添加到 OperationContext.Current.Extensions。在发送回复之前,自定义上下文将从扩展集合中删除。
这是一种相当常见的模式,如下所述:
在哪里存储当前 WCF 调用的数据?ThreadStatic 安全吗?
和这里:
只要服务接收到请求,处理它,发送回复并接收下一个请求,这一切都可以正常工作。但是,如果服务收到一个请求并且在能够回复之前收到第二个请求怎么办?我构建了一个小型控制台应用程序来测试它。我从 2 个不同的线程发送 2 条消息,我让 wcf 服务等待 2 秒,以确保第二个请求在第一个请求完成之前进入,这就是我得到的:
站点 ID:test1450;会话:uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70;id=2:线程 ID:6
站点 ID:test1450;会话:uuid:2caf47cf-7d46-4d72-9275-d9c037fa0e70;id=3:线程 ID:22
看起来 wcf 创建了在 2 个不同线程上执行的 2 个会话,但站点 ID 是相同的。它不应该。由此看来,OperationContext.Current.Extensions 是线程之间共享的集合。现在我倾向于认为我的测试是错误的,我错过了一些东西。
有没有人尝试过类似的事情并发现 OperationContext.Current 不是线程安全的?
wcf - IOperationBehavior 和 IContractBehavior 之间的区别?
当我们在开发中看到这两者之间的差异时,我想知道和之间有什么区别IOperationBehavior
以及什么是特殊情况。IContractBehavior
wcf - WCF - 消息和消息缓冲区关闭
Msdn 说:消息还处置了在处置时用于构造正文的对象。
由此我推断关闭 Message 也会关闭它创建的 MessageBuffer。但在实际代码中并非如此。关闭消息将 messagebuffer.closed 保留为 false。
应该如何关闭消息缓冲区和从该缓冲区创建的消息?
c# - 如何从实现 IServiceBehavior/IOOperationBehavior 的属性中获取 OperationContext
我有一个实现 IServiceBehavior 的属性来保护我的 WCF 服务,如下所示:
问题是为了获取消息头,我必须获取当前的 OperationContext,但我不知道如何在 ApplyDispatchBehavior 中进行操作。如果我在安全的方法中这样做,它会起作用。
c# - WCF:在 IErrorHandler 中提供通用的 FaultException
一些上下文:我们有一个自定义 XSD 并使用 WSCF.blue 生成 WSDL 和 C# 代码。客户端使用ChannelFactory<T>
并共享接口,该接口包括 WSCF.blue 添加的所有属性以匹配 XSD 中的内容。
我正在尝试实现IErrorHandler.ProvideFault
它提供泛型的地方FaultException<T>
,但在客户端我得到了一个非泛型的FaultContract
. 这是我的ProvideFault
方法的样子:
在每种服务方法中,如果我对其进行尝试/捕获,throw FaultExceptionFactory.CreateFaultException(ex)
它会按预期工作,所以我认为[FaultContract]
、工厂、绑定等都是正确的。以防万一,这就是工厂的工作方式:
我认为问题在于消息是如何创建的IErrorHandler
,也许是在CreateMessageFault()
. 我读过该动作应该是faultException.Action
代替null
,但实际上faultException.Action
是null
。也许这是导致问题的原因。我可以在工厂中设置一个动作,但是这个动作应该是什么,为什么手动投掷不会出现?
我可能缺少的任何其他想法?
编辑: 我检查了 WSDL 并找到了我正在调用的特定操作及其操作:
我尝试对动作进行硬编码:Message.CreateMessage(..., "http://myNamespace/MyMethodBusinessRuleFaultExceptionTypeFault")
并将其设置为.Action
在工厂中,但这仍然不起作用。
编辑 2: throw/catch 生成以下 XML,允许在客户端捕获通用异常:
生成以下IHttpErrorHandler
非泛型FaultException
:
编辑 3:
如果我添加[DataContract]
和[DataMember]
,BusinessRuleFaultExceptionType
那么我得到几乎正确的 XML:
它缺少代码和原因的命名空间。至少我认为这缩小了范围。常规序列化使用[XmlType]
and[XmlElement]
而 theIErrorHandler
使用[DataContract]
and [DataMember]
。不幸[DataMember]
的是不允许你设置命名空间,所以我认为现在的问题是如何在IErrorHandler
. 这描述了我的问题,但由于上述原因,修复不起作用:http: //twenty6-jc.blogspot.com/2011/05/ierrorhandlerprovidefault-serialization.html
编辑4:
我部分发现了这个问题。我们正在使用XmlSerializer
,但由于IErrorHandler
超出了操作范围,因此它恢复为默认值DataContractSerializer
。解决方案是更改您的服务以在任何地方使用,或者在创建故障时DataContractSerializer
手动选择。XmlSerializer
这两篇文章提供了我所需要的:
http://twenty6-jc.blogspot.com/2011/05/ierrorhandlerprovidefault-serialization.html http://zamd.net/2008/08/15/serializing-faults-using-xmlserializer/
这让我非常接近。它与工作 XML 相同,只是缺少异常类型的命名空间:
我认为它没有添加xmlns="http://myNamespace/Services"
,因为它没有请求的上下文。该命名空间是在接口中定义的,但不是数据协定。我真的会被迫留在请求的上下文中(希望IOperationInvoker
有效),而不是使用IHttpHandler
?
c# - WCF extension for adding outgoing message properties on client side dynamically
I am consuming a WCF service which has multiple operations, this service requires me to add outgoing message properties whenever I call any of its operations.
At the moment i am just adding the properties every time i call the service inside the code.
Here is my code to do it:
How can I create a WCF extension that adds these message properties dynamically?
I have few knowledge about the extension but not enough to intercept and add these headers.
c# - WCF 自定义编码器 - 在运行时分配消息内容类型
我目前正在构建自己的 WCF 编码器来解析我的消息。我想动态更改发送回复时分配的内容类型,但我无法理解他在哪里寻找它。
他是使用 CustomTextEncoder.ContentType 还是内部编码器的内容类型?我怎样才能强迫他以“text/xml”或“application/soap+xml”的形式发送响应?
先感谢您。
编辑 -只是为了澄清我需要在我的自定义编码器的 WriteMessage 方法中做出决定。我正在使用一个包含请求的内容类型的字符串属性,但他没有正确执行。
不幸的是,当我发送消息时,他仍在分配我的编码器的默认值......
asp.net-mvc - 结构映射异常 202
我在 WCF 服务和 MVC 4 应用程序上使用 StructureMap,我已经在它们两个上都配置了它,但是一旦我运行应用程序,我就会收到以下异常:
StructureMap 异常代码:202 没有为 PluginFamily LookupsRepositories.Lookups.ILookupRepository 定义默认实例 [[JE.Domain.Lookups.Status, JE.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], LookupsRepositories,版本=1.0.0.0,文化=中性,PublicKeyToken=null
这LookupRepository
是一个抽象类,一个泛型类,这就是我注册它的方式:
调用注册表Global.asax
:
仍然我得到了例外。知道为什么吗?
注意:StructureMap 版本 2.6.4.0
c# - 以编程方式在 WCF 中的 Endpoint Contract 上添加操作
我必须为遗留系统搭建一座桥梁。选择的前端是 WCF。遗留系统的方法可能会有所不同并且数量众多,所以我正在考虑这样的事情:
- 获取遗留方法元数据(有可能)
- 在 WCF 服务的 public static void Configure(ServiceConfiguration config) 中,为每个方法创建一个操作。
- 要开心。
现在我离第 3 点还很远,因为我似乎无法创建一个操作并用适当的行为填充它。到目前为止,特别是,我无法创建 OperationInvokerBehavior,例如(它不是公共类)。
我不打算在这里详述。我的问题是我的方法是否合理,并且在 WCF 开发人员之外有人这样做过。
entity-framework - WCF 与 IOperationInvoker 使用 Entity 和 Ninject
我有一个 WCF 服务,我需要从中记录对其方法的调用。为此,我使用此解决方案来跟踪调用并调用我的内部审计服务,该服务使用 Entity 5.1 并使用 Ninject 注入服务/存储库/DbContext。
我的 Invoke 方法如下所示:
在我的 Ninject 模块中,我有这样注册的内部内容:
当我在存储库中调用 dbContext 来添加新的 Audit 对象时,就会出现问题,如下所示:
它错误地声称 DbContext 已被处置。
在 WCF 服务上注册 DbContext 以便为 IOperationInvoker 注册的正确方法是什么?
我不得不提一下,对于我在 MVC4 中厌倦了这个后端的主站点,我的所有这些声明都是相同的,它工作得很好(那里没有 WCF)。所以我很确定需要为 WCF 生命周期更正一些东西,但不太确定是什么。