问题标签 [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 投票
11 回答
43396 浏览

.net - 为什么找不到我的自定义 WCF 行为扩展元素类型?

我有一个包含两个项目的解决方案。一个项目是 ASP.NET Web 应用程序项目,一个是类库。Web 应用程序具有对类库的项目引用。这些都不是强命名的。

在我将称之为“框架”的类库中,我有一个端点行为(一个 IEndpointBehavior 实现)和一个配置元素(一个从 BehaviorExtensionsElement 派生的类)。配置元素使我可以通过配置将端点行为附加到服务。

在 Web 应用程序中,我有一个启用 AJAX 的 WCF 服务。在 web.config 中,我将 AJAX 服务配置为使用我的自定义行为。配置的 system.serviceModel 部分非常标准,如下所示:

在运行时,这可以完美运行。启用 AJAX 的 WCF 服务正确使用我自定义配置的端点行为。

问题是当我尝试添加新的 AJAX WCF 服务时。如果我添加 -> 新项目...并选择“启用 AJAX 的 WCF 服务”,我可以看到它添加 .svc 文件和代码隐藏,但是当它更新 web.config 文件时,我收到此错误:

配置文件不是 WCF 服务库的有效配置文件。

无法加载为扩展“customEndpointBehavior”注册的类型“Framework.MyBehaviorExtensionsElement、Framework、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null”。

显然配置是完全有效的,因为它在运行时完美运行。如果我暂时从我的行为配置中删除该元素,然后添加启用 AJAX 的 WCF 服务,一切都会顺利进行。

不幸的是,在一个更大的项目中,我们将拥有多个具有不同配置的服务,暂时删除所有自定义行为将很容易出错。虽然我意识到我可以不使用向导并手动完成所有操作,但不是每个人都可以,而且能够按照它的用途使用该产品会很好 - 向导和所有。

为什么找不到我的自定义 WCF 行为扩展元素类型?

更新/说明:

  • 它确实在运行时工作,而不是在设计时工作。
  • 当我尝试添加服务时,框架程序集位于 Web 项目的 bin 文件夹中。
  • 虽然我可以手动添加服务(“无需配置”),但我需要开箱即用的项目模板才能工作——这就是问题的全部目标。
  • 在 Visual Studio 2008 中可以看到此问题。在 VS 2010 中,此问题似乎已得到解决。

我在 Microsoft Connect 上提交了这个问题,结果你要么必须将自定义配置元素放在 GAC 中,要么将其放在 IDE 文件夹中。他们不会修复它,至少现在是这样。我已经发布了他们提供的解决方法作为这个问题的“答案”。

0 投票
1 回答
1355 浏览

wcf - 从 WCF 操作中获取 ClientCredentials

我的 WCF 服务使用自定义凭据验证器来实现基于消息的自定义安全性,因为我想确保在我的 Web 服务上调用操作的每个客户端在我的数据库中都有相应的用户名和密码。

问题是,一旦用户通过身份验证,我想在我的 OperationContract 实现中使用 userName 来进行基于上下文的调用。

我不能依赖被调用者的诚实来指定他们的实际用户名,所以如果不输入密码就无法通过它。我想避免每次调用我的 Web 服务时都必须接受 ClientCredentials。

谢谢。

0 投票
1 回答
4293 浏览

wcf - 什么是 WCF 调度管道消息流

我试图更好地理解 WCF 的调度过程,特别是对各种可扩展点的影响和影响。从底部列出的网页中,一旦通道堆栈将消息传递给调度程序,WCF 似乎将按规定的顺序执行以下操作。

  1. 消息检查器
  2. 操作选择器
  3. 消息格式
  4. 参数检查器
  5. 操作调用者。

我正在尝试找到一些选项来解决我遇到的问题,我正在考虑的一种方法是结合使用消息检查器、操作选择器、消息格式和操作调用程序。不幸的是,我的观察似乎表明执行顺序如下:

  1. 操作选择器
  2. 消息检查器
  3. 操作调用程序 (AllocateInputs())
  4. 消息格式
  5. 参数检查器
  6. 操作调用程序 (Invoke())

我可以理解在格式化消息之前调用自定义调用程序 AllocateInputs() 方法的细微差别,因为消息格式化部分本质上是将给定消息反序列化为一组方法参数,以传递给适当的操作和调用程序的 AllocateInputs( ) 方法指定需要多少个参数。

抛出我的部分是消息检查器和操作选择器之间的顺序反转。对我来说,当消息检查器对消息进行操作时首先运行它们听起来很合乎逻辑,而操作选择器确定消息的目标是哪个服务操作。

问题:

  • 这是由于 WCF 的不同版本或发行版造成的吗?
  • 这是因为 WCF 实际上并没有指定扩展点执行顺序吗?

参考页面:
扩展 WCF 以支持自定义数据格式- Zulfiqar 的博客
使用自定义行为扩展 WCF - MSDN 服务站 2007 年 12 月
消息流拦截点- Nicholas Allen 的 Indigo 博客

注意:我很抱歉没有提供链接,因为我仍然是菜鸟,所以不能提供多个链接。=)

0 投票
2 回答
718 浏览

wcf - WCF:消息框架和自定义通道

我试图了解如何使用 WCF 实现消息框架。目标是在 WCF 中创建一个可以通过 Tcp 处理专有格式的服务器。我不能使用 net.Tcp 绑定,因为这仅适用于 SOAP。

我需要编写一个自定义通道来接收以下格式的消息。示例消息是“5 abcde”。特别是我不确定如何在我的自定义频道中进行取景。

这是一些示例代码

}

所以基本上第一次 EndTryReceive 可以从待处理的读取缓冲区“5 ab”中获取一条消息。然后第二次它可以得到剩下的信息。问题是当第一次调用 EndTryReceive 时,我被迫创建一个 Message 对象,这意味着会有部分 Message 进入通道堆栈。

我真正想做的是确保缓冲区中有完整的消息“5 abcde”,这样当我在 EndTryReceive 中构造消息时,它就是完整的消息。

有没有人有任何他们如何使用 WCF 进行自定义框架的示例?

谢谢, 瓦迪姆

0 投票
1 回答
9137 浏览

.net - 无法加载为扩展“[extensionHere]”注册的类型 [nameHere]

我一直在学习和构建在 fx3.5 上使用 WCF 的 JSONP Web 服务。您可以阅读我在.NET ASMX - Returning Pure JSON? 我终于运行了一个示例,但现在我正在将它尾随到我的应用程序中。

服务的 web.config:

我收到以下错误,我已经尝试了我能想到的一切来修复它。在我的代码中发现了一些错别字(服务而不是服务)。我正在使用MSDN上的示例代码。这是错误:

有人对我还能检查什么有任何想法吗?有一个名为 RivWorks.Web.Service.dll 的 DLL,它正在被构建并复制到网站的 bin 目录中。服务 Web.config 被复制到网站的服务目录。我在网站的 web.config 中没有任何冲突。我检查了所有拼写问题。

0 投票
5 回答
12147 浏览

wcf - wcf app.config 中的元素“行为”具有无效的子元素“myFaultExtension”

我正在尝试从 Silverlight 客户端应用程序中的 WCF 服务中捕获常规异常。为此,我在我的 WCF 服务中包含了相应的更改,如MSDN 文章中所述

但是当我配置行为扩展并在端点行为中使用相同的行为时,就会出现上述错误,并且由于此错误,服务无法运行。

我把我的配置放在这里。请建议我该如何解决这个问题?

0 投票
1 回答
4430 浏览

c# - IDispatchMessageInspector:改进 BeforeSendReply 功能


在我的 WCF 项目中,我需要在响应中使用自定义标头,因此我实现了 IDispatchMessageInspector。老实说,一切都很好,但我对一件小事感到不安。
问题是,即使我只是将 .svc 作为页面打开,或者将服务加载到 WCF 测试客户端中,BeforeSendReply 和 AfterReceiveRequest 都会触发。
那么,第一个问题:这种行为正常吗?是否有一些方法可以以声明方式处理(可能是一些 web.config 技巧)?
目前我使用下一个代码:

所以现在我使用它来处理所有不是服务调用的调用:

但我很确定还有其他更好的方法来处理这个问题。所以我的主要问题是:请建议我一种更好的方法来处理所描述的情况。
提前致谢!

更新 1
我的 system.serviceModel 部分

更新 2(接受的解决方案)
我花了一些时间调查问题的根源,最后我找到了可以接受的解决方案。
所以我发现了什么:
首先Message是一个抽象类。所以BeforeSendReply每次都会收到不同类型的具体消息。
最常用的是:
1) System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.MetadataOnHelpPageMessage- 表示客户端将 svc 作为页面打开。结果 = 众所周知的 html 格式页面,其中包含有关 svc 服务的常见信息。对于这种类型reply.Version.EnvelopeEnvelopeVersion.None.
2) 获取元数据请求。这是一个有点棘手的部分,它取决于我们是否使用 MEX。System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage因此,如果我们使用 MEX,那么请求将执行到 .svc/mex 端点,其消息类型将reply.Version.Envelope等于.svc/mex EnvelopeVersion.Soap12
如果我们不使用 MEX,那么客户端会执行很少的请求来获取 wsdl 数据。消息类型将为XMLSchemaMessage.
3) 执行web方法请求。这仅对我类型的请求有用。它是System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage并且reply.Version.Envelope等于EnvelopeVersion.Soap11

我使用的是 basicHttpBinding,所以 SOAP 版本是 1.1。所以我的最终代码应该只检查回复是否有 SOAP 信封并检查它的版本。如果信封存在并且版本为 1.1,那么我们可以非常确定我们有 Web 方法调用,并且可能会添加自定义标头:

0 投票
1 回答
1751 浏览

wcf - WCF 服务行为扩展抛出空引用异常

所以,我正在尝试编写路由服务。这个想法是,每次有人调用路由服务时,WCF 行为扩展都会随机选择端点。我使用了 MSDN 中名为DynamicReconfiguration的稍作修改的示例来实现这一点。我的 web.config 的一部分看起来像这样

以及行为和行为扩展的实现

问题是UpdateRules方法的最后一行抛出NullReferenceException。即使我在行为中附加它,它也找不到这个扩展。在来自 MSDN 的示例中,路由服务托管在控制台应用程序中,并且我尝试将其托管在 IIS 上。我在这里错过了一些东西......

0 投票
1 回答
68 浏览

.net - 区分来自客户端和其他服务的请求

我们有一个 3 层应用程序 - 基于 winform 的胖客户端、Windows 服务和 sql 中托管的几个 WCF 服务。一些 WCF 服务在客户端中提供特定于 UI 的功能,但有一些服务正在运行以进行数据加载、处理、缓存等。因此,所有这些服务相互通信并为来自客户端的请求提供服务。

现在出现了实际问题:有没有办法了解请求是来自客户端还是来自其他服务。假设我编写了一个消息检查器,我能否以某种方式解释请求是来自客户端(用户)还是来自另一个服务。

我想要实现的目标 -如果您需要,这在另一个线程中。停止用户对 wcf 服务的请求。但简而言之,我试图阻止用户访问服务,但服务应该继续运行并且可以被其他服务访问/从其他服务访问。

0 投票
1 回答
1388 浏览

wcf - 在 IOperationInvoker 实现中访问 MethodInfo

我已经实现了 IOperationInvoker 来自定义 WCF 调用。在调用方法中,我想访问由 OperationInvoker 调用的方法的自定义属性。我已经编写了以下代码。但是,它没有给出在该方法上指定的自定义属性。