WCF 请求不通过 asp.net 管道流动

WCF request doesn't flow via asp.net pipeline

我在 asp.net 应用程序中托管了一个 WCF 服务。

这是服务(缩写):

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceContract(Name = Name, Namespace = Namespace)]
[ServiceBehavior(Name = Name, Namespace = Namespace)]
public class WcfMaintenanceFacade {...}

这里是主机:

RouteTable.Routes.Add(new ServiceRoute("entity/maintenance/5.20", new ServiceHostFactory(), typeof(WcfMaintenanceFacade)));

这里是相关的配置部分:

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

我的服务实例化,请求正在传入,事件 HttpContext.Current 不为空。

有两个(对我来说主要的)问题我无法解决:

  1. HttpContext.Current.Session为空
  2. Global.asax 的 Application_BeginRequest 从未被调用

是的,从调用堆栈来看,请求似乎正在通过 WCF 激活管道,而不是 ASP.net 管道。那我做错了什么?

  1. 关于会话,您使用 OperationContext.Current.RequestContext 而不是 HttpContext.Current.Session 来处理它。

HttpContext: Current is always null when accessed from within a WCF service. Use T:System.ServiceModel.OperationContext.Current.RequestContext instead.

在此处阅读更多内容:https://msdn.microsoft.com/en-us/library/aa702682.aspx

  1. Application_BeginRequest 被 ASP.Net 应用程序使用,但 WCF 与普通 Web 应用程序的工作方式不同,因此无法在每个请求上命中 BeginRequest。

The ASP.NET HTTP runtime handles ASP.NET requests but does not participate in the processing of requests destined for WCF services .... he WCF Service Model intercepts messages addressed to WCF services and routes them through the WCF transport/channel stack

所以,您的问题可能与此问题有关。此信息也可在 link.

希望对您的问题有所帮助。

对我来说,很明显这两种技术不应该在同一个应用程序中工作,这就是为什么它们有两个不同的管道。本质上的服务是一件孤立的事情。现在您只是尝试找到一个解决方法,依赖于它们都在同一个 IIS 上工作的事实。

我建议您从目标开始,从您想要实现的目标开始。如果您需要将新的类似服务的功能集成到本机 ASP.NET 应用程序中,您可以

1) 使用 ASMX 服务(如果需要,会给你 SAOP)and/or 页面方法

2) 尝试集成 WEB API 以防您需要 JSON 服务。

答案很简单(而且很明显):

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">

是的。 RAMMFAR.