从WCF Web服务访问HttpContext.Current

时间:2011-05-05 21:30:13

标签: wcf service httpcontext

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

3 个答案:

答案 0 :(得分:50)

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

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

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

您甚至可以通过使用其他属性修饰服务类来强制执行A​​spNetCompatibility:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

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

答案 1 :(得分:25)

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

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

答案 2 :(得分: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;
        }