代码之家  ›  专栏  ›  技术社区  ›  Travis Illig

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

  •  45
  • Travis Illig  · 技术社区  · 16 年前

    我有一个包含两个项目的解决方案。一个项目是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文件和codebehind,但是当它更新web.config文件时,我会得到以下错误:

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

    无法加载为扩展名“customEndpointBehavior”注册的类型“framework.myBehaviorExtensionsElement,framework,version=1.0.0.0,culture=neutral,publicKeyToken=null”。

    显然,配置是完全有效的,因为它在运行时工作得很好。如果我临时从行为配置中删除元素,然后添加启用了Ajax的WCF服务,一切都会顺利进行。

    不幸的是,在一个较大的项目中,我们将拥有多个具有不同配置的服务,临时删除所有自定义行为将很容易出错。虽然我意识到我可以不使用向导而手动执行所有操作,但并非每个人都可以,而且如果能够像预期的那样使用产品(向导和所有功能),那就太好了。

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

    更新/澄清:

    • 它在运行时工作,而不是在设计时。
    • 当我尝试添加服务时,框架程序集在Web项目的bin文件夹中。
    • 虽然我可以手动添加服务(“无需配置”),但我需要现成的项目模板来工作——这就是问题的全部目标。
    • 此问题出现在Visual Studio 2008中。 与2010年相比,这似乎得到了解决。

    I filed this issue on Microsoft Connect 结果是,要么将自定义配置元素放在GAC中,要么将其放在IDE文件夹中。他们至少暂时不会修好。我已经发布了他们提供的解决方法作为这个问题的“答案”。

    10 回复  |  直到 10 年前
        1
  •  21
  •   Travis Illig    16 年前

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

    未能添加新的 服务项:添加新项时 更新配置文件, 系统将尝试加载 配置文件,因此它将尝试 搜索并加载 此配置文件中的CUSOM扩展名。 只有在装配 GACED或位于同一路径上 as vs exe(程序文件\microsoft Visual Studio 9.0 \common7 \ide),即 系统可以找到它。否则, 错误对话框将弹出并“添加 新项目“将失败。

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

    你能试试现在的工作吗 阶段:GAC您的自定义扩展 组装或复制到“程序” 文件\Microsoft Visual Studio 9.0 \common7 \ide?

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

    不幸的是,看来我在这件事上运气不好。

        2
  •  8
  •   user247702    10 年前

    我刚刚用过

    [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 数字正确。

        3
  •  6
  •   cdmdotnet    14 年前

    作为一个仅供这些天偶然遇到的任何人参考的方法,一个可能的解决方案是在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>
    

    这个特别的解决方案对我很有效。

        4
  •  4
  •   Derek Atlansky    16 年前

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

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

        5
  •  2
  •   James Bender    16 年前

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

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

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

        6
  •  2
  •   abatishchev Karl Johan    12 年前

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

    • 将dll安装到gac中,即gacutil/i bla.dll
    • 获取dll的fqn,即gacutil/l bla
    • 将结果FQN复制到web.config中
    • 在vs中添加新服务
    • 从GAC卸载DLL,即gacutil/u bla

    一起 只有 .

        7
  •  1
  •   to StackOverflow    16 年前

    将程序集放在GAC中可能会有所帮助,但我很感激这不是您要寻找的答案。不确定else-vs将在何处查找除GAC和包含devenv.exe的目录之外的程序集。

        8
  •  0
  •   Ryan    11 年前

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

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

        9
  •  0
  •   MSallal    11 年前

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

        10
  •  0
  •   jrmack    10 年前

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