从WCF Web服务访问HttpContext.Current

32

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

3个回答

54

通过启用AspNetCompatibility,最好通过配置方式来实现,可以访问HttpContext.Current

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

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

您甚至可以通过在服务类上添加其他属性来强制使用AspNetCompatibility:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

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


感谢您的输入。我给了您一个赞。我将在测试此操作后标记我的答案。我们在应用程序中略有不同地存储用户,因此我们需要按照表单身份验证建议重新设计事物。然后我可以使用这种方法。 - Entree
值得注意的是,这仅适用于您的服务托管在IIS中的情况。 - Russell Horwood

27

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

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


4
+1 这应该是被采纳的答案。我们正在处理可以托管在Windows服务或自托管中的WCF。AspNetCompatilibity只是一种旧习惯。 - Askolein

4

如果您不想更改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;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接