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



我已经实现了一个使用WebServiceHostWebHttpBinding的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 没有太大区别。看看这个链接,看看它是否适合你。

最新更新