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

Posted

技术标签:

【中文标题】为啥找不到我的自定义 WCF 行为扩展元素类型?【英文标题】:Why isn't my custom WCF behavior extension element type being found?为什么找不到我的自定义 WCF 行为扩展元素类型? 【发布时间】:2010-09-15 05:20:52 【问题描述】:

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

在我称之为“框架”的类库中,我有一个端点行为(一个 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 服务时。如果我添加 -> 新项目...并选择“启用 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 文件夹中。他们不会修复它,至少现在是这样。我已经发布了他们提供的解决方法作为这个问题的“答案”。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

您的帖子似乎没有适当考虑已经发布的内容。我不确定您是否仔细阅读了问题和答案,因为 Travis 发布了 08 IDE 的 MS 解决方法给出的答案。今后请提供有价值的深思熟虑的反馈。【参考方案2】:

我刚用过

[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" />

其中 Version=1.0.0.0 这是错误的!!!

所以你有两个选择

    返回

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

    每次构建都手动将 Version=1.0.0.0 替换为正确的数字。

【讨论】:

该问题不是程序集版本问题,而是 VS2008 中的缺陷。这可能已在 VS2010 中修复 - 我尚未验证。在 VS2010 中,您确实需要正确的程序集版本号......但这不是所提出问题的解决方案,对不起。 @TravisIllig 我有 VS2010,当我完全这样做时,我已经描述它工作正常。 对。在 VS2010 中。这意味着他们必须在 VS2010 中修复它,我为此感到高兴。他们在 VS2008 中没有这样的修复。不过,感谢您的入住。 为什么在私有程序集探测中使用版本?【参考方案3】:

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

【讨论】:

【参考方案4】:

如果您使用的是框架 3.5,则 Culture=neutral 小而不是 Culture=Neutral in CAPITAL

【讨论】:

问题中的示例表明 Culture=neutral 正确使用了小写。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

以下是对我有用的步骤列表:

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

全部

【讨论】:

如问题所示和各种cmet中提到的,该类型已经完全合格。根本问题是VS2008中的一个缺陷。此外,您无需安装到 GAC 即可获取程序集的名称,只需使用反射即可。 @TravisIllig:我刚刚描述了我自己的步骤以使其在 VS2012U1 中工作。我的类型也完全合格并且仍然抛出异常。但是我没有放任何平台 = MSIL,它没有被 Reflector 列在 FQN 中。然后我执行了这些步骤并让它工作。但是 VS 最终在 Web.config 中添加了 0 行,所以下次我将复制粘贴现有服务。【参考方案7】:

作为对最近偶然发现此问题的任何人的参考,一个可能的解决方案是在您的 app.config/web.config 中完全限定您的程序集。 例如 如果你有

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

尝试 - 将值替换为必要的

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

这个特殊的解决方案对我有用。

【讨论】:

您会注意到在我的示例中该类型已经是完全限定的;问题不在于完整的类型限定,而是 Visual Studio 中存在明显缺陷。 谢谢,解决了我的问题! 您应该将 标签写在一行中,如上所示。如果你把它写成多行,那么它就行不通了。希望这会有所帮助。 还将platform=MSIL 添加到 FQN 谢谢,将PublicKeyToken=null 添加到我几乎完整的设置列表中解决了我的情况。【参考方案8】:

根据微软在the Connect issue 上发布的the workaround 我为此提交的文件,这是一个已知问题,至少在当前版本中不会有任何解决方案:

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

我了解您的痛点。 不幸的是,我们不能接受这个 当前版本的变化。我们将 在以后的版本中调查它并 尝试提供更好的解决方案 然后,比如提供一个浏览对话框 使客户能够指定 路径,或更好的错误信息 指出一些解决方案, 等等……

你能尝试一下当前的解决方法吗 阶段:GAC 你的自定义扩展 组装或复制到“程序 文件\Microsoft Visual Studio 9.0\Common7\IDE”?

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

不幸的是,我在这件事上似乎不走运。

【讨论】:

我还需要在异常消失之前重新启动 VS。 在 vs2008 中有“解决方法”,但是在 VS 2010 中有什么解决方案吗? 从下面的其他答案看来,他们已经解决了 VS2010 中的问题。只要您在程序集和配置文件之间保持程序集版本号同步,就可以了。 (我没有亲自测试过。YMMV。) 我在VS2013中仍然有同样的问题。快速提示 - 只需在创建新服务时注释掉扩展元素,然后取消注释。将文件添加到 GAC 或 IDE 文件夹并不是很酷 imo。【参考方案9】:

我在一个新项目中尝试了这个,只是为了确保它不是您的特定项目/配置并且有完全相同的问题。

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

【讨论】:

这实际上对我有用。在 GAC 中安装 DLL 并没有解决问题,但是将其存储在 Common7\IDE\ 中确实......谢谢!!!【参考方案10】:

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

【讨论】:

不幸的是,这不是一个真正的选择。【参考方案11】:

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

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

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

【讨论】:

框架程序集在设计时位于 bin 文件夹中。 VS 似乎没有找到它。

以上是关于为啥找不到我的自定义 WCF 行为扩展元素类型?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 返回空的自定义集合类型

Lighthouse 找不到我的 Union 自定义类型

WCF 服务中的自定义证书验证

Android - 具有自定义属性的自定义 UI

我的自定义编辑器找不到我要查找的字段

在Wordpress上使用ACF上的自定义字段时找不到“图库”字段类型