【问题标题】:WCF hosted in a Web application and compatibility modeWCF 托管在 Web 应用程序和兼容模式中
【发布时间】: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

标签: .net .net-3.5 wcf


【解决方案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 语句为我解决了这个问题。

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

      【讨论】:

        猜你喜欢
        • 2016-08-14
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        相关资源
        最近更新 更多