为什么没有find我自定义的WCF行为扩展元素types?

我有一个包含两个项目的解决scheme。 一个项目是一个ASP.NET Web应用程序项目,一个是类库。 Web应用程序具有对类库的项目引用。 这两个都没有强烈的名字。

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

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

<system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="MyEndpointBehavior"> <enableWebScript /> <customEndpointBehavior /> </behavior> </endpointBehaviors> </behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> <services> <service name="WebSite.AjaxService"> <endpoint address="" behaviorConfiguration="MyEndpointBehavior" binding="webHttpBinding" contract="WebSite.AjaxService" /> </service> </services> <extensions> <behaviorExtensions> <add name="customEndpointBehavior" type="Framework.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </behaviorExtensions> </extensions> </system.serviceModel> 

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

问题是当我尝试添加一个新的AJAX WCF服务。 如果我做Add – > New Item …并select“启用AJAX的WCF服务”,我可以看到它添加.svc文件和代码隐藏,但是当它更新web.config文件时,我得到这个错误:

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

无法加载types“Framework.MyBehaviorExtensionsElement,Framework,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”的扩展名“customEndpointBehavior”。

显然,configuration是完全有效的,因为它在运行时完美运行。 如果我暂时从我的行为configuration中删除元素,然后添加支持AJAX的WCF服务,一切顺利。

不幸的是,在一个更大的项目中,我们将有多种configuration的多种服务,临时删除所有的自定义行为将是容易出错的。 虽然我意识到我可以不使用向导而手动完成任何事情,但并不是每个人都可以,而且能够使用产品,因为它本来就是要用到的 – 向导和所有的东西。

为什么没有find我自定义的WCF行为扩展元素types?

更新/澄清:

  • 它在运行时工作,而不是devise时间。
  • 当我尝试添加服务时,框架程序集位于Web项目的bin文件夹中。
  • 虽然我可以手动添加服务(“没有configuration”),但我需要开箱即用的项目模板才能工作 – 这是问题的整个目标。
  • 在Visual Studio 2008中可以看到这个问题。 在VS 2010中,这似乎已经解决了。

我在Microsoft Connect上提出了这个问题,事实certificate,您必须将自定义configuration元素放在GAC中,或放到IDE文件夹中。 他们不会修理它,至less现在。 我已经发布了他们提供的解决方法,作为这个问题的“答案”。

根据微软公布的关于我为此提交的Connect问题 的解决办法 ,这是一个已知的问题,至less在当前版本中不会有任何解决scheme:

无法添加新服务项目的原因:添加新项目并更新configuration文件时,系统会尝试加载configuration文件,因此会尝试在该configuration文件中search并加载cusom扩展的程序集。 只有在程序集是GAC的情况下,或者位于与exe(Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE)相同的path中,系统才能find它。 否则,会popup错误对话框,“添加新项目”将失败。

我明白你的痛点。 不幸的是,我们不能在当前版本中进行这种更改。 我们将在以后的版本中进行调查,然后尝试提供更好的解决scheme,例如提供浏览对话框以使客户能够指定path,或者更好的错误消息来指示解决scheme的某些工作等。

你可以尝试在现阶段的工作:GAC您的自定义扩展程序集或将其复制到“Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE”?

我们将提供自述文件以帮助可能遇到同样问题的其他客户。

不幸的是,这一次我似乎运气不好。

我刚刚用过

 [assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0.0")] //[assembly: AssemblyFileVersion("1.0.0.0")] 

所以我每次都有新的程序集编号。

但我们有

  <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 

版本= 1.0.0.0这是错误的!

所以你有2个选项

  1. 回到

     //[assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] Keep it manually. [assembly: AssemblyFileVersion("1.0.0.0")] 
  2. 每个生成都会使用正确的编号手动replaceVersion = 1.0.0.0

作为任何人在这些日子里绊倒一个可能的解决scheme是完全限定您的程序集在您的app.config / web.config。 EG,如果你有

 <system.serviceModel> <extensions> <behaviorExtensions> <add name="clientCredential" type="Client.ClientCredentialElement, Client" /> </behaviorExtensions> </extensions> 

尝试 – 取代价值观necassary

 <system.serviceModel> <extensions> <behaviorExtensions> <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions> 

这个特定的解决scheme为我工作。

我尝试了一个新的项目,以确保它不是你的具体项目/configuration,并有完全相同的问题。

使用融合日志,看起来系统仅在IDE目录(C:\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE)中查找行为扩展。 在后期构build步骤中将程序集复制到此目录是有效的,但是很难看。

你有你的自定义行为在您的Web项目的bin目录的Framework.dll的副本? 如果不是这可能是问题。 Visual Studio正在寻找行为的实现。 由于它在您的configuration中列出,它不认为看在其他项目; 它期望在垃圾箱里findassembly。

取决于你的项目是如何设置的,它可能能够在debugging中运行,而不用把这个程序集放在bin中,尽pipeVS通常build立它并把它放在那里。 但是,这又取决于事情的设置。

无论如何,可能只是想在devise时可以检查组件是否可用。

以下是我工作的步骤清单:

  • 安装dll到GAC,即gacutil /我Bla.dll
  • 得到dll的FQN,即gacutil / l Bla
  • 将生成的FQN复制到Web.config中
  • 在VS中添加新的服务
  • 从GAC卸载dll,即gacutil / u Bla

只有在一起。

将程序集放到GAC中可能会有所帮助,但是我很欣赏这不是您正在寻找的答案。 不知道除了GAC和包含devenv.exe的目录外,VS还会在哪里寻找程序集。

我通过注释web.config中的相关部分来解决这个问题,包括使用自定义扩展的元素,元素和元素。

之后,我可以添加一个WCF服务到项目中,将这些行添加回web.config并发布项目。

如果你正在使用框架3.5, 文化=中立的小而不是文化=中立的资本

我在同一个项目(dll)中的扩展类作为我的服务类,并不能得到它的工作。 一旦我把它移动到另一个项目,并从它的服务项目中引用它。 以防万一遇到这个问题。