从 WCF Web 服务访问 HttpContext.Current

Posted

技术标签:

【中文标题】从 WCF Web 服务访问 HttpContext.Current【英文标题】:access HttpContext.Current from WCF Web Service 【发布时间】:2011-08-19 17:53:24 【问题描述】:

我刚开始使用带有 ASP.NET AJAX 的 WCF 服务。我从 javascript 实例化我的 WCF 服务,然后将字符串变量作为参数传递给我的 WCF 服务方法(使用 OperationContract 签名)。然后我返回一个绑定到我的自定义 Javascript 类的 .NET 对象(使用 DataContract 定义)。我无法根据登录到我的网络会话的用户进行身份验证。但是,WCF Web 服务是一个完全不同的服务,没有 HttpContext.Current 对象的上下文。访问该对象的最安全方法是什么?

【问题讨论】:

【参考方案1】:

您可以通过启用 AspNetCompatibility 来访问HttpContext.Current,最好是通过配置:

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

这反过来又允许您访问当前用户:HttpContext.Current.User - 这就是您所追求的,对吧?

您甚至可以通过使用附加属性装饰您的服务类来强制执行 AspNetCompatibility:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

(在 System.ServiceModel.Activation 命名空间中。) 如果该属性已就位,除非启用 AspNetCompatibility,否则您的服务将无法启动!

【讨论】:

感谢您的意见。我给了你一点。一旦我测试了这个,我会标记我的答案。我们在应用程序中存储用户的方式略有不同,因此我们必须按照他们为表单身份验证推荐的内容重新设计。然后我可以使用这种方法。 值得注意的是,这仅在您的服务托管在 IIS 中时才有效。【参考方案2】:

默认情况下您没有 HttpContext,但在 OperationContext(始终存在)或 WebOperationContext(仅适用于某些绑定)中存在许多相同的对象。

您可以使用静态 .Current 属性访问 OperationContext 或 WebOperationContext,如下所示:WebOperationContext.Current

【讨论】:

+1 这应该是公认的答案。我们正在处理可以托管在 Windows 服务中或自托管的 WCF。 AspNetCompatilibity 只是一个旧习惯。【参考方案3】:

如果您不想更改 Web.config 或无法更改:

private string GetClientIPAddress()
        
            var props = OperationContext.Current.IncomingMessageProperties;
            var endpointProperty = props[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            if (endpointProperty != null)
            
                if (endpointProperty.Address == "::1" || String.IsNullOrEmpty(endpointProperty.Address))
                    return "127.0.0.1";

                return endpointProperty.Address;
            

            return String.Empty;
        

【讨论】:

以上是关于从 WCF Web 服务访问 HttpContext.Current的主要内容,如果未能解决你的问题,请参考以下文章

从 jQuery 访问 Web 服务 - 跨域

无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务

WCF Web 服务错误

从 WCF 过渡 WCF RESTful [重复]

WCF Web 服务无法访问 Web Config 中的服务名称

从同一主机上的子域访问时未找到 WCF 错误