【问题标题】:Is there a way to save state during a WCF method call?有没有办法在 WCF 方法调用期间保存状态?
【发布时间】:2014-02-24 18:48:15
【问题描述】:

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

User u = GetAuthenticatedUser();

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

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

WCF 是否有任何东西表示可以保存信息的每个服务调用“状态”?

【问题讨论】:

  • 我阅读了整篇文章,但似乎没有谈论 WCF 中包含调用状态的任何内容。只有会话和实例上下文。我不希望通过多次通话来保持状态。我想将一些数据与特定呼叫相关联,该呼叫将在呼叫完成时被清除。另一种方法是将有关进行调用的用户的信息传递给每个函数。我可以这样做,但我希望有类似 CallState 对象的东西。
  • 另外,@Mitch,简单地发布文章链接并不是回答 StackOverflow 问题的最佳方式。链接可以移动,和/或内容可以更改。它也没有回答这个问题。
  • re: 文章链接,我没时间。这就是为什么它是评论,而不是答案
  • 你的帖子应该更清楚

标签: wcf authentication


【解决方案1】:

使用extension 中的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;

相关:Where to store data for current WCF call? Is ThreadStatic safe?

【讨论】:

  • 谢谢。我会看看这个,看看它是否有效。我将不得不阅读更多关于“OperationContext.Current”的内容
【解决方案2】:

简短的回答是不,没有办法使用 BasicHTTPBinding 或 webHTTPBinding 保存会话状态(缺少将状态值写入数据库以供后续检索);两者都像 Web 服务器一样工作,不会在请求之间保存任何内容。

但我认为你可以使用 wsHttpBinding,它与 webHttpBinding 并没有太大区别。看看这个link,看看它是否适合你。

【讨论】:

  • 我并没有说我想保存从请求到请求的任何内容。我想在单个操作期间保存状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2021-01-13
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多