2010-03-03 42 views
13

我有一个WCF服务托管在Web应用程序(IIS)中。我需要通过wsHttp和另一个netTcp暴露1个终点。我在IIS7环境中,使我可以托管基于非HTTP的服务。无论如何,当我浏览。 svc文件使用的浏览器,我得到的错误:WCF以Web应用程序和兼容模式托管

The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application

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

[AspNetCompatibilityRequirements(
     RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

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

我如何设置它,以便:

  • 我可以支持非HTTP端点
  • 我可以托管在一个Web应用程序的服务
  • 我不ASPNET创建多个服务之一兼容性打开,另一个关闭
+0

您使用的是ASP.NET功能吗?如果是这样,哪一个?它可以被删除吗? –

+0

尚未 - 迄今(不确定如果我将在未来使用会话或上下文)。你是说如果我不使用任何asp.net功能,我应该能够关闭AspNetCompatibility,并将其托管在网络主机中? – DotnetDude

+0

为什么不使用Windows服务公开服务? 我认为除非你使用WAS,否则第一和第二是不可能的。 –

回答

4

推测,您的IIS兼容性设置已打开,为您的IIS应用程序。似乎与This link有关。

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

编辑:这是您需要进行配置更改/检查(从提供的链接)。值应该从'false'更改为'true'。

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

如果我关闭ASP.NET兼容性,那么我会得到“激活错误”(消息在我原来的帖子中) – DotnetDude

+0

在您的原始文章中,您正在讨论如何向服务添加一个属性,以确定该服务是否可以运行在AspCompatibilityMode中。我正在讨论如何配置应用程序 - 在您的web配置中 - 以便应用程序根本不使用AspCompatibilityMode(并且您的属性变得冗余)。我的回答已被编辑。 –

1

请尝试设置multipleSiteBindingsEnabled是在ServiceHostingEnvironment如此。我不是WCF的专家,但是在阅读了一堆网站之后,我认为这很有意义,因为您同时使用了TCP和HTTP服务端点。

希望这会有所帮助。

7

这里有很多事情要做。首先,除非你特别使用ASP.net功能,否则不应该使用兼容模式。把它们关掉,请按照柯克的建议,并从代码中删除这一行:刚刚举办一个HTTP服务不需要

[AspNetCompatibilityRequirements(
     RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

兼容性模式,这只是如果你想使用ASP.net功能不在WCF中(或者需要将旧的asmx服务移植到WCF而不更改其他代码)。

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

所以只要启用了兼容性模式,你就不可能做什么。删除它,然后事情应该工作。

0

我也遇到过这个问题。
它是通过迁移一些引用系统的新代码而产生的。Web名称空间,但实际上并不需要它,放入现有的WCF项目中。 删除那些使用语句解决了我的问题。

我希望能够追踪那些需要这个命名空间但幸运的代码。