49

我有一个包含两个项目的解决方案。一个项目是 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 行为扩展元素类型?

更新/说明:

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

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

4

11 回答 11

22

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

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

我理解你的痛点。不幸的是,我们无法在当前版本中进行此更改。我们将在以后的版本中对其进行调查并尝试提供更好的解决方案,例如提供浏览对话框以使客户能够指定路径,或者提供更好的错误消息以指示一些解决方案等...

您可以在当前阶段尝试解决方法:GAC 您的自定义扩展程序集或将其复制到“Program Files\Microsoft Visual Studio 9.0\Common7\IDE”吗?

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

不幸的是,看来我在这方面不走运。

于 2009-01-14T15:54:44.057 回答
8

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

<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>

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

于 2010-07-26T04:08:28.733 回答
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这是错误的!!!

所以你有2个选择

  1. 回到

    //[assembly: AssemblyVersion("1.0.*")] 
    [assembly: AssemblyVersion("1.0.0.0")]  Keep it manually.
    [assembly: AssemblyFileVersion("1.0.0.0")] 
    
  2. 每个构建都手动将Version=1.0.0.0替换为正确的数字。

于 2012-05-24T13:38:51.563 回答
4

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

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

于 2008-10-20T18:11:28.087 回答
2

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

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

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

于 2008-10-04T20:56:49.133 回答
2

这是对我有用的步骤列表:

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

都在一起而已

于 2012-12-29T08:34:35.523 回答
1

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

于 2008-10-07T20:27:28.723 回答
0

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

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

于 2013-08-09T21:29:51.697 回答
0

如果您使用的是框架 3.5,那么Culture=neutral in small not Culture=Neutral in CAPITAL

于 2014-01-14T20:17:01.083 回答
0

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

于 2014-09-25T13:46:16.467 回答
0

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

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

于 2021-03-06T08:04:07.020 回答