从 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的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务