当前位置:  开发笔记 > 后端 > 正文

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

如何解决《为什么找不到我的自定义WCF行为扩展元素类型?》经验,为你挑选了3个好方法。

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

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

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


 
  
   
    
    
   
  
 
 
 
 
  
  
 
 
  
   
  
 

在运行时,这非常有效.启用AJAX的WCF服务正确使用我自定义配置的端点行为.

问题是当我尝试添加新的AJAX WCF服务时.如果我执行Add - > 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中,这似乎已得到解决.

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



1> Travis Illig..:

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

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

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

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

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

不幸的是,看来我在这个上运气不好.


我在VS2013中仍然遇到同样的问题.快速提示 - 只需在创建新服务时注释掉extensions元素,然后取消注释即可.将文件添加到GAC或IDE文件夹并不是很酷.
在vs2008中有"解决方法",但VS 2010中的任何解决方案?

2> Developer..:

我刚刚用过

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

所以我每次都有新的装配编号.

但我们有

   

其中,版本= 1.0.0.0这是不对的!

所以你有2个选择

    回到

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

    每个构建都使用正确的数字手动替换Version = 1.0.0.0.



3> cdmdotnet..:

对于任何偶然发现这一天的人来说,可能的解决方案是在app.config/web.config中完全限定您的程序集.EG,如果你有


    
        
            
        
    

尝试 - 将值替换为necassary


    
        
            
        
    

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


在我的例子中你会注意到该类型已经完全合格; 问题不在于完全类型限定,而是在Visual Studio中存在明显缺陷.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有