我已经实现了一个使用WebServiceHost
和WebHttpBinding
的WCF服务。我在每次方法调用开始时通过这样的调用手动执行基本身份验证:
User u = GetAuthenticatedUser();
GetAuthenticatedUser
正在使用WebOperationContext.Current.IncomingRequest.Headers["Authorization"]
标头来根据数据库中的条目对用户进行身份验证。
我遇到的问题是我在一次服务调用中多次调用GetAuthenticatedUser
因为我的方法没有传递User对象。
WCF是否有代表每个服务调用“状态”的信息可以保存?
答案 0 :(得分:1)
使用OperationContext
的{{3}}:
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;
相关:extension
答案 1 :(得分:-1)
简短的回答是“否”,没有办法用BasicHTTPBinding或webHTTPBinding保存会话状态(缺少将状态值写入数据库以供后续检索);两者都像Web服务器一样工作,不保存从请求到请求的任何内容。
但我认为你可以使用wsHttpBinding,它与webHttpBinding没什么不同。看看这个link,看看它是否适合你。