【问题标题】:WCF request doesn't flow via asp.net pipelineWCF 请求不通过 asp.net 管道流动
【发布时间】:2015-10-01 12:02:29
【问题描述】:

我有一个托管在 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 管道。那我做错了什么?

【问题讨论】:

  • 当涉及到 wcf 执行管道时,您应该使用OperationContext。为什么 WCF 服务会使用 global.asax?它不是特定于 Web 应用程序的吗?
  • 如果你的服务依赖于会话,你可以在你的服务上实现可靠会话。请阅读-msdn.microsoft.com/en-us/library/ms733136(v=vs.110).aspx
  • 我正在将 WCF 服务集成到已经严重依赖 asp.net 管道的遗留应用程序中。
  • 这两种技术的处理流程不同。因此,将 WCF 消息路由到 ASP.Net 管道是不可取的。要在 WCF 中启用会话,您必须启用可靠会话,但是这将如何与 ASP.Net 会话进行通信,我不确定。如果您找到解决方法告诉我,同时我也在寻找解决方案。
  • 来自 MSDN -msdn.microsoft.com/en-us/library/ms733040(v=vs.110).aspx 在 Windows Communication Foundation (WCF) 应用程序中,会话将一组消息关联到一个会话中。 WCF 会话不同于 ASP.NET 应用程序中可用的会话对象,支持不同的行为,并以不同的方式进行控制。

标签: asp.net wcf integrated-pipeline-mode


【解决方案1】:
  1. 关于会话,您可以使用 OperationContext.Current.RequestContext 而不是 HttpContext.Current.Session 来处理它。

HttpContext:从 WCF 中访问时,Current 始终为 null 服务。采用 T:System.ServiceModel.OperationContext.Current.RequestContext 代替。

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

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

ASP.NET HTTP 运行时处理 ASP.NET 请求,但不处理 参与处理发往 WCF 服务的请求 .... WCF 服务模型截获发送给 WCF 的消息 服务并通过 WCF 传输/通道堆栈路由它们

所以,您的问题可能与此问题有关。此信息也可在同一链接中找到。

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

【讨论】:

  • 不幸的是,这两点都与我的事业无关。首先,我需要访问asp.netSession,因为整个应用程序都是依赖它编写的。其次,可以通过 asp.net 管道路由 WCF 消息(例如,使用经典模式和通配符脚本映射),但我很惊讶我无法在集成模式下实现相同的行为。
【解决方案2】:

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

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

是的。 RAMMFAR。

【讨论】:

    【解决方案3】:

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

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

    1) 使用 ASMX 服务(如果你需要它会给你 SAOP)和/或页面方法

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

    【讨论】:

    • 我需要 SOAP。当前的实现使用 ASMX,但我想更好地控制服务和合同行为。
    • 另外:如果他们不应该在同一个应用程序中工作,AspNetCompatibilityRequirements 来自哪里?
    • 好的。也许你是对的。如果您的模式真的设置为正确的值,您是否尝试在运行时检查(ServiceHostingEnvironment.AspNetCompatibilityEnabled 属性)?正如我在这里看到的 (msdn.microsoft.com/en-us/library/…) MS 所说,您应该可以访问会话。
    • 是的,我知道 MS 说什么,但仍然:ServiceHostingEnvironment.AspNetCompatibilityEnabledtrueHttpContext.Current不是 nullHttpContext.Current.Session null。这正是我的问题。
    • 但是 Serg Rogovtsev,在 Application_BeginRequest 中您仍然没有创建会话,它必须先点击 Session_Start 才能创建会话。我认为您正试图过早地访问会话,而不是 global.asax 流量。在 Session_Start 中设置一个断点并检查您的会话对象是否仍然为空。
    猜你喜欢
    • 2011-04-06
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2013-04-27
    相关资源
    最近更新 更多