有没有办法在WCF方法调用期间保存状态?

时间:2014-02-24 18:48:16

标签: wcf authentication

我已经实现了一个使用WebServiceHostWebHttpBinding的WCF服务。我在每次方法调用开始时通过这样的调用手动执行基本身份验证:

User u = GetAuthenticatedUser();

GetAuthenticatedUser正在使用WebOperationContext.Current.IncomingRequest.Headers["Authorization"]标头来根据数据库中的条目对用户进行身份验证。

我遇到的问题是我在一次服务调用中多次调用GetAuthenticatedUser因为我的方法没有传递User对象。

WCF是否有代表每个服务调用“状态”的信息可以保存?

2 个答案:

答案 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,看看它是否适合你。