WCF 托管在 Web 应用程序和兼容模式中

Posted

技术标签:

【中文标题】WCF 托管在 Web 应用程序和兼容模式中【英文标题】:WCF hosted in a Web application and compatibility mode 【发布时间】:2011-01-23 10:32:29 【问题描述】:

我有一个托管在 Web 应用程序 (IIS) 中的 WCF 服务。我需要在wsHttp 上公开一个端点,在netTcp 上公开另一个端点。我在一个 IIS7 环境中,这使我可以托管非基于 HTTP 的服务。无论如何,当我使用浏览器浏览 .svc 文件时,出现错误:

该服务无法激活,因为它不支持 ASP.NET 兼容性。此应用程序已启用 ASP.NET 兼容性

通过谷歌搜索,我意识到 WCF 以两种模式运行 - 混合和 ASP.NET 兼容。当我应用属性时

[AspNetCompatibilityRequirements(
       RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

但是,一旦我将此属性应用于服务合同实现,我似乎无法使用非 HTTP 绑定。

我该如何设置:

我可以支持非 HTTP 端点 我可以在 Web 应用上托管服务 我没有创建多个服务,一个打开了 aspnet 兼容性,另一个关闭了

【问题讨论】:

您使用的是 ASP.NET 功能吗?如果有,是哪一个?可以去掉吗? 还没有 - 到目前为止(不确定我将来是否会使用会话或上下文)。你是说如果我不使用任何 asp.net 功能,我应该能够关闭 AspNetCompatibility 并仍然将其托管在 Web 主机中? 为什么不使用 Windows 服务公开服务?我认为除非你使用 WAS,否则第一个和第二个是不可能做到的。 我想知道他们是如何在 StockTrader 示例应用程序中做到这一点的。我相信它们支持托管在 Web 应用(不是 WAS)上的服务的 HTTP 和非 HTTP 绑定 好的,我在 Appfabric 上托管了 WCF 服务。我仍然无法关闭 AspNetCompatibilityRequirements 【参考方案1】:

这里发生了很多事情。首先,除非您实际上是专门使用 ASP.net 功能,否则您不应该使用兼容模式。要关闭它,请遵循 Kirk 的建议,并从您的代码中删除此行:

[AspNetCompatibilityRequirements(
       RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

兼容模式不仅需要托管 HTTP 服务,还需要使用 WCF 中没有的 ASP.net 功能(或者需要将旧的 asmx 服务移植到 WCF 而不更改其他代码) .

第二个问题是使用 IIS 托管非 HTTP 绑定。这仅适用于 IIS 7,并且仅使用 WAS。 ASP.net 兼容性不适用于非 HTTP 绑定,因为 ASP.net 需要 HTTP。

因此,只要启用了兼容模式,您就不可能做到这一点。删除它,然后事情应该可以工作了。

【讨论】:

【参考方案2】:

猜测一下,您的 IIS 应用程序启用了 ASP.NET 兼容性设置。 This link 似乎是相关的。

我建议你关闭 ASP.NET 兼容模式。我在 IIS 中从同一个应用程序运行 net.tcp 和 basicHttp 端点没有问题。

edit:这是您需要进行/检查的配置更改(来自提供的链接)。该值应从“false”更改为“true”。

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled=”true” />
</system.serviceModel>

【讨论】:

如果我关闭 ASP.NET 兼容性,则会收到“激活错误”(我的原始帖子中的消息) 在您的原始帖子中,您正在讨论向服务添加一个属性,该属性确定该服务是否可以在 AspCompatibilityMode 下运行。我说的是配置应用程序 - 在您的 Web 配置中 - 以便应用程序根本不使用 AspCompatibilityMode(并且您的属性变得多余)。我的答案已被编辑。【参考方案3】:

请尝试在 ServiceHostingEnvironment 中将 multipleSiteBindingsEnabled 设置为 true。我不是 WCF 方面的专家,但在解决了这个问题并阅读了一堆网站之后,我认为这是有道理的,因为您同时使用 TCP 和 HTTP 服务端点。

希望这会有所帮助。

【讨论】:

【参考方案4】:

我也遇到过这个问题。 它是由于将一些引用 System.Web 命名空间但实际上并不需要它的新代码迁移到现有的 WCF 项目中。 删除那些 using 语句为我解决了这个问题。

我预计必须追踪需要该命名空间的代码,但很幸运。

【讨论】:

以上是关于WCF 托管在 Web 应用程序和兼容模式中的主要内容,如果未能解决你的问题,请参考以下文章

HttpContext 在以 ASP.NET 兼容模式运行的 WCF 服务中为空

在 WPF 应用程序中托管 WCF Web 服务

在 MVC Web 应用程序中托管 WCF 服务

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

如何结合调试 Azure 应用服务和 IIS 托管的 WCF?

如何从托管在另一台服务器上的 Web 应用程序调用客户端计算机托管的 Wcf 服务?