我有一个包含两个项目的解决方案。一个项目是 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 文件夹中。他们不会修复它,至少现在是这样。我已经发布了他们提供的解决方法作为这个问题的“答案”。