WCF REST 服务 - 在每个方法上将字符串参数替换为类实例
本文关键字:参数 字符串 替换 实例 方法 服务 REST WCF | 更新日期: 2023-09-27 18:31:43
我正在编写一个具有移动客户端的WCF REST服务。
移动客户端使用沿OAuth行的"authToken"来表示用户的身份。
authToken 是一个字符串参数,目前,它被传递给服务中的(几乎)每个方法。
我想做的是编写类似于 MVC ActionFilter 的东西 - 它为每个方法运行并执行 authToken 处理:验证令牌,查找相关帐户并返回帐户实例对象 - 查找失败意味着返回错误,甚至没有调用我的方法。
我发现这两个问题与我想做的事情有点相似,但似乎棘手的部分以某种方式引入帐户实例? 我可以非常愉快地创建我的 [AuthOperation] 属性来实现 IOperationBehavior 接口,但我无法弄清楚我需要做什么才能引入我查过的新帐户实例。
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
Account = new Account(_context);
if (!Account.LoadByAuthToken(((string)inputs[0]).FromEncodedString()))
{
outputs = new object[0];
return new ErrorResponse
{
Code = ResponseCode.Exception.ToString(),
DebugMessage = MyStrings.AuthToken_NotFound
};
}
如何将我的账户实例传递到调用的方法中?
object result = this._originalInvoker.Invoke(instance, IntroduceAccount(inputs,Account), out outputs);
return result;
}
最终我想要的是拥有
public MyResponse GetContacts(string authToken)
在服务中公开,但
public MyResponse GetContacts(Account acct)
或
public MyResponse GetContacts(Account acct, string authToken)
实际在服务器上实现 - 并由"操作过滤器"处理 authToken -> 帐户转换。
如果答案是"不要使用 WCF,这样做......",我什至会很高兴......"只要提出其他建议也符合我的其他要求。
您是否考虑过使用拦截? 看看这个例子。 还有其他拦截器实现。 此链接还具有更多选项。
事实证明,我真的很愚蠢,(几乎)实现我的目标实际上相当简单。
在上面的(调用)方法中,您可以访问正在调用的实例。所以。。。。
var wcfAccountRequired = instance as IWcfAccountRequired;
if (wcfAccountRequired != null)
{
(wcfAccountRequired).Account = Account;
}
。我只是确保特定接口由(实例)实现,并在其上分配 Account 属性。 如果我没有成功检索帐户,我可以只返回错误而不调用任何内容。
不完美,但简洁地解决了我的问题。