问题标签 [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.

0 投票
1 回答
3612 浏览

multithreading - WCF Operation.Context 不是线程安全的?

我正在审查 WCF 服务的代码。在每条消息的标头中,我们注入数据,服务稍后将使用这些数据来构建到 DB 的连接字符串。这是因为该服务将被许多不同的站点使用,每个站点都有自己的数据库,该服务必须查询。我们使用 wcf 可扩展性。我们有一个自定义 MessageInspector,它在收到请求后,从消息头中提取数据,创建一个上下文(实现 IExtension)并将其添加到 OperationContext.Current.Extensions。在发送回复之前,自定义上下文将从扩展集合中删除。

这是一种相当常见的模式,如下所述:

在哪里存储当前 WCF 调用的数据?ThreadStatic 安全吗?

和这里:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/319cac66-66e8-4dfe-9a82-dfd289c9df1f/wcf-doesnt-have-session-storage-so-where-should-one-store-呼叫特定数据?forum=wcf

只要服务接收到请求,处理它,发送回复并接收下一个请求,这一切都可以正常工作。但是,如果服务收到一个请求并且在能够回复之前收到第二个请求怎么办?我构建了一个小型控制台应用程序来测试它。我从 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 不是线程安全的?

0 投票
1 回答
880 浏览

wcf - IOperationBehavior 和 IContractBehavior 之间的区别?

当我们在开发中看到这两者之间的差异时,我想知道和之间有什么区别IOperationBehavior以及什么是特殊情况。IContractBehavior

0 投票
1 回答
573 浏览

wcf - WCF - 消息和消息缓冲区关闭

Msdn 说:消息还处置了在处置时用于构造正文的对象。

由此我推断关闭 Message 也会关闭它创建的 MessageBuffer。但在实际代码中并非如此。关闭消息将 messagebuffer.closed 保留为 false。

应该如何关闭消息缓冲区和从该缓冲区创建的消息?

0 投票
1 回答
731 浏览

c# - 如何从实现 IServiceBehavior/IOOperationBehavior 的属性中获取 OperationContext

我有一个实现 IServiceBehavior 的属性来保护我的 WCF 服务,如下所示:

问题是为了获取消息头,我必须获取当前的 OperationContext,但我不知道如何在 ApplyDispatchBehavior 中进行操作。如果我在安全的方法中这样做,它会起作用。

0 投票
2 回答
7449 浏览

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.Actionnull。也许这是导致问题的原因。我可以在工厂中设置一个动作,但是这个动作应该是什么,为什么手动投掷不会出现?

我可能缺少的任何其他想法?

编辑: 我检查了 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?

0 投票
3 回答
5987 浏览

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.

0 投票
2 回答
1558 浏览

c# - WCF 自定义编码器 - 在运行时分配消息内容类型

我目前正在构建自己的 WCF 编码器来解析我的消息。我想动态更改发送回复时分配的内容类型,但我无法理解他在哪里寻找它。

他是使用 CustomTextEncoder.ContentType 还是内部编码器的内容类型?我怎样才能强迫他以“text/xml”或“application/soap+xml”的形式发送响应?

先感谢您。

编辑 -只是为了澄清我需要在我的自定义编码器的 WriteMessage 方法中做出决定。我正在使用一个包含请求的内容类型的字符串属性,但他没有正确执行。

不幸的是,当我发送消息时,他仍在分配我的编码器的默认值......

0 投票
1 回答
166 浏览

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

0 投票
1 回答
636 浏览

c# - 以编程方式在 WCF 中的 Endpoint Contract 上添加操作

我必须为遗留系统搭建一座桥梁。选择的前端是 WCF。遗留系统的方法可能会有所不同并且数量众多,所以我正在考虑这样的事情:

  1. 获取遗留方法元数据(有可能)
  2. 在 WCF 服务的 public static void Configure(ServiceConfiguration config) 中,为每个方法创建一个操作。
  3. 要开心。

现在我离第 3 点还很远,因为我似乎无法创建一个操作并用适当的行为填充它。到目前为止,特别是,我无法创建 OperationInvokerBehavior,例如(它不是公共类)。

我不打算在这里详述。我的问题是我的方法是否合理,并且在 WCF 开发人员之外有人这样做过。

0 投票
2 回答
155 浏览

entity-framework - WCF 与 IOperationInvoker 使用 Entity 和 Ninject

我有一个 WCF 服务,我需要从中记录对其方法的调用。为此,我使用解决方案来跟踪调用并调用我的内部审计服务,该服务使用 Entity 5.1 并使用 Ninject 注入服务/存储库/DbContext。

我的 Invoke 方法如下所示:

在我的 Ninject 模块中,我有这样注册的内部内容:

当我在存储库中调用 dbContext 来添加新的 Audit 对象时,就会出现问题,如下所示:

它错误地声称 DbContext 已被处置。

在 WCF 服务上注册 DbContext 以便为 IOperationInvoker 注册的正确方法是什么?

我不得不提一下,对于我在 MVC4 中厌倦了这个后端的主站点,我的所有这些声明都是相同的,它工作得很好(那里没有 WCF)。所以我很确定需要为 WCF 生命周期更正一些东西,但不太确定是什么。