2

我有一个托管在 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.asaxApplication_BeginRequest永远不会被调用

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

4

3 回答 3

4
  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 传输/通道堆栈路由它们

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

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

于 2015-10-02T11:02:36.417 回答
1

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

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

是的。拉姆法尔。

于 2015-11-11T14:28:43.600 回答
0

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

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

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

2)如果您需要JSON服务,请尝试集成WEB API。

于 2015-10-27T14:41:48.783 回答