测试发布到虚拟目录中时发生的报错现象,由于不支持asp.net兼容性而导致服务无法激活启用。
具体错误信息如下:
解决方案:
1、web.config中增加
注意这个是放在<system.servicemodel>中的。
2、在wcf的服务类加上附加属性 aspnetcompatibilityrequirements
其实,通过阅读小注可以发现,下面两种方式均可:
小注:
1、servicehostingenvironment.aspnetcompatibilityenabled 属性:
获取一个值,该值指示此服务是否在 asp.net http 应用程序管道的上下文中运行。
如果为当前 appdomain 启用了 asp.net 兼容性,则为 true;否则为 false。 默认值为 false。
2、aspnetcompatibilityrequirementsmode 枚举:
指定 windows communication foundation (wcf) 服务是否(或能否)以与 asp.net 兼容的模式运行。
尽管 wcf 模型旨在跨宿主环境和传输保持行为的一致性,但经常在一些方案中,应用程序中不要求这种程度的灵活性。 wcf 的 asp.net 兼容模式适用于具有以下特点的方案:不需要具有在 iis 外部承载或通过 http 之外的协议进行通信的能力,但使用 asp.net web 应用程序平台的所有功能。
基于文件的授权:在 asp.net 兼容模式中运行的 wcf 服务可以通过将文件系统访问控制列表 (acl) 附加到服务的 .svc 文件来获得保护。
可配置的 url 授权:当 wcf 服务在 asp.net 兼容模式中运行时,将对 wcf 请求强制执行 asp.net 的 url 授权规则。
asp.net 模拟:wcf 服务使用 asp.net 模拟线程的当前标识来运行,如果已为应用程序启用 asp.net 模拟,则该标识可能与 iis 进程标识不同。 如果为某个特定服务操作同时启用 asp.net 模拟和 wcf 模拟,则服务模拟最终使用从 wcf 获得的标识来运行。
可通过下面的配置(位于应用程序的 web.config 文件中)在应用程序级别上启用 wcf 的 asp.net 兼容模式:
如果没有指定,则此值默认为“true”。 若将此值设置为“false”,则指示在应用程序中运行的所有 wcf 服务将不在 asp.net 兼容模式中运行。
[aspnetcompatibilityrequirements(requirementsmode = aspnetcompatibilityrequirementsmode.allowed)]
public class calculatorservice : icalculatorsession
{//implement calculator service methods.}
下表演示应用程序范围的兼容模式设置如何与单独服务指定的支持级别交互:
应用程序范围的兼容模式设置
[aspnetcompatibilityrequirementsmode]
设置
观察到的结果
aspnetcompatibilityenabled = “true”
<a target="_blank" href="https://msdn.microsoft.com/zh-cn/library/system.servicemodel.activation.aspnetcompatibilityrequirementsmode.aspx">required</a>
服务成功激活。
<a target="_blank" href="https://msdn.microsoft.com/zh-cn/library/system.servicemodel.activation.aspnetcompatibilityrequirementsmode.aspx">allowed</a>
<a target="_blank" href="https://msdn.microsoft.com/zh-cn/library/system.servicemodel.activation.aspnetcompatibilityrequirementsmode.aspx">notallowed</a>
服务接收消息时发生激活错误。
aspnetcompatibilityenabled = “false”
说明
iis 7.0 和 was 允许 wcf 服务通过 http 之外的协议进行通信。 但是,在已启用 asp.net 兼容模式的应用程序中运行的 wcf 服务不允许公开非 http 终结点。 在服务接收其第一条消息时,这种配置会生成激活异常。