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

时间:2008-10-03 23:44:35

标签: .net wcf exception-handling wcf-extensions

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

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

在Web应用程序中,我有一个支持AJAX的WCF服务。在web.config中,我将AJAX服务配置为使用我的自定义行为。配置的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服务正确使用我自定义配置的端点行为。

问题是当我尝试添加新的AJAX WCF服务时。如果我做Add - &gt; New Item ...并选择“支持AJAX的WCF服务”,我可以看到它添加.svc文件和代码隐藏,但是当它更新web.config文件时,我收到此错误:

  

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

     

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

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

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

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

更新/澄清:

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

I filed this issue on Microsoft Connect事实证明,您必须将自定义配置元素放在GAC中或将其放在IDE文件夹中。他们不会修复它,至少目前是这样。我已经发布了他们提供的解决方法作为这个问题的“答案”。

11 个答案:

答案 0 :(得分:21)

微软在the workaround上发布的the Connect issue我提交了这个问题,这是一个已知问题,至少在当前版本中没有任何解决方案:

  

无法添加新内容的原因   服务项目:添加新项目时   并更新配置文件,   系统会尝试加载   配置文件,所以它会尝试   搜索并加载程序集   此配置文件中的cusom扩展名。   仅在装配的情况下   GACed或位于同一路径   as vs exe(Program Files \ Microsoft   Visual Studio 9.0 \ Common7 \ IDE),.   系统可以找到它。否则,   将弹出错误对话框并“添加一个   新项目“将失败。

     

我理解你的痛点。   不幸的是我们不能接受这个   当前版本的变化。我们会   在以后的版本中调查它   尝试提供更好的解决方案   然后,例如提供浏览对话框   使客户能够指定   路径,或更好的错误消息   表明解决方案的一些工作,   等...

     

你能尝试一下当前的工作吗?   阶段:GAC您的自定义扩展程序   汇编或复制到“程序   Files \ Microsoft Visual Studio   9.0 \ Common7 \ IDE“?

     

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

不幸的是,我觉得这个运气不好。

答案 1 :(得分:8)

我刚用过

[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 这是错误的!!!

所以你有两个选择

  1. 返回

    //[assembly: AssemblyVersion("1.0.*")] 
    [assembly: AssemblyVersion("1.0.0.0")]  Keep it manually.
    [assembly: AssemblyFileVersion("1.0.0.0")] 
    
  2. 每个版本都会手动将版本= 1.0.0.0 替换为正确的编号。

答案 2 :(得分:6)

答案 3 :(得分:4)

我尝试使用新项目只是为了确保它不是您的特定项目/配置并且具有完全相同的问题。

使用Fusion日志,系统似乎只在IDE目录(C:\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE)中查找行为扩展。

在构建后的步骤中将程序集复制到此目录是有效的。

答案 4 :(得分:2)

您是否在Web项目的bin目录中有自定义行为的Framework.dll副本?如果不是那可能是问题。 Visual Studio正在寻找行为的实现。由于它在您的配置中列出,因此不会考虑查看其他项目;它希望在垃圾箱中找到组件。

根据项目的设置方式,它可能能够在调试中运行而不将此程序集放入bin中,尽管VS通常构建它并将其放在那里。但同样,这取决于事情的设置方式。

无论如何,可能只想仔细检查装配在设计时是否可用。

答案 5 :(得分:2)

以下是为我工作的步骤列表:

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

一起

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

之后,我可以向项目添加WCF服务,将行添加回web.config并发布项目。

答案 8 :(得分:0)

如果您使用框架3.5 文化=中立小而不是文化=中性资本

答案 9 :(得分:0)

我在同一个项目(dll)中有扩展类作为我的服务类,无法让它工作。一旦我将它移动到另一个项目并从它工作的服务项目中引用它。以防万一其他人遇到这个问题。

答案 10 :(得分:0)

我在实现我的接口的类中定义了扩展类,这导致了“无法加载”错误,其中 WCF 无法加载我的扩展类。

将扩展类定义移出接口实现(但仍在同一个项目/dll 中)解决了我的问题。