我已经实现了一个使用WebServiceHost
和WebHttpBinding
的WCF服务。我在每个方法调用开始时通过如下调用手动执行基本身份验证:
User u = GetAuthenticatedUser();
其中GetAuthenticatedUser
使用WebOperationContext.Current.IncomingRequest.Headers["Authorization"]
标头根据数据库中的条目对用户进行身份验证。
我遇到的问题是我在单个服务调用中多次调用GetAuthenticatedUser
,因为我的方法不会传递 User 对象。
WCF 是否有任何内容表示可以保存信息的每个服务调用"状态"?
使用扩展名 OperationContext
:
public class UserContext : IExtension<OperationContext>
{
public User User { get; set; }
public static User CurrentUser
{
set
{
UserContext context = OperationContext.Current.Extensions.Find<UserContext>();
if (context == null)
{
context = new UserContext();
OperationContext.Current.Extensions.Add(context);
}
context.User = value;
}
get
{
UserContext context = OperationContext.Current.Extensions.Find<UserContext>();
if (context == null)
{
return null;
}
return context.User;
}
}
public void Attach(OperationContext owner) { }
public void Detach(OperationContext owner) { }
}
使用示例:
UserContext.CurrentUser = new User("foo");
var user = UserContext.CurrentUser;
相关:在哪里存储当前 WCF 调用的数据?ThreadStatic 安全吗?
简短的回答是否定的,没有办法用BasicHTTPBinding或webHTTPBinding保存会话状态(没有将状态值写入数据库以供后续检索);两者都像Web服务器一样工作,不会在请求之间保存任何内容。
但我认为你可以使用 wsHttpBinding,它与 webHttpBinding 没有太大区别。看看这个链接,看看它是否适合你。