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

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

【问题讨论】:

    标签: wcf service httpcontext


    【解决方案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;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多