将令牌传递给WCF服务

本文关键字:服务 WCF 令牌传递 | 更新日期: 2023-09-27 18:07:45

我真的需要知道如何将令牌传递给WCF服务,而无需向我的所有合约添加额外的参数,一些值如数字,以便我可以稍后在我的服务中使用它

将令牌传递给WCF服务

使用自定义标头可以解决这个问题。

你可以给你的客户端分配一个自定义的头,像这样:

            IContextChannel contextChannel = (IContextChannel)myServiceProxy;
            using (OperationContextScope scope = new OperationContextScope(contextChannel))
            {
                MessageHeader header = MessageHeader.CreateHeader("PlayerId", "", _playerId);
                OperationContext.Current.OutgoingMessageHeaders.Add(header);
                act(service);
            }

在服务端,你可以得到这个值:

    private long ExtractPlayerIdFromHeader()
    {
        try
        {
            var opContext = OperationContext.Current;
            var requestContext = opContext.RequestContext;
            var headers = requestContext.RequestMessage.Headers;
            int headerIndex = headers.FindHeader("PlayerId", "");
            long playerId = headers.GetHeader<long>(headerIndex);
            return playerId;
        }
        catch (Exception ex)
        {
            this.Log.Error("Exception thrown when extracting the player id from the header", ex);
            throw;
        }
    }

关于如何通过配置文件设置自定义头,请参见这个问题

一种方法是使用WCFExtras并将值放在soap标头中。

[SoapHeader("MyToken", typeof(Header), Direction = SoapHeaderDirection.In)]
[OperationContract]
string In();

这将使令牌在WSDL中很明显,以防服务的操作需要它。

另一种选择是使用HTTP头,这可以在不赋予方法属性的情况下完成。这样做的缺点是令牌不会出现在WSDL中,因此服务不再完全由WSDL描述。