我有一个包含两个项目的解决方案.一个项目是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>
Run Code Online (Sandbox Code Playgroud)
在运行时,这非常有效.启用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行为扩展元素类型?
更新/澄清:
我在Microsoft Connect上提交了此问题,但事实证明您必须将自定义配置元素放在GAC中或将其放在IDE文件夹中.他们不会修复它,至少目前是这样.我已经发布了他们提供的解决方法作为这个问题的"答案".
我想添加一个行为扩展,以便我的服务类将使用Ninject进行实例化.我创建了一个继承自BehaviorExtensionElement的类,并在我的App.config中注册它.我看不到任何明显的遗漏,但是在启动时抛出了这个:
System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration section handler for system.serviceModel/behaviors: Extension element TestExtension cannot be added to this element. Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions.
Parameter name: element (...\MyAssembly.dll.config line 42) --->
System.ArgumentException: Extension element TestExtension cannot be added to this element.
Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions.
Parameter name: element
Run Code Online (Sandbox Code Playgroud)
这是我的App.config:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="TestExtension" type="Mynamespace.DependencyInjectionServiceBehavior,MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<TestExtension/> …Run Code Online (Sandbox Code Playgroud)