1

我真的需要知道如何在不向所有合同添加额外参数的情况下将令牌传递给 WCF 服务,例如数字之类的一些值,以便我以后可以在我的服务中使用它。

4

2 回答 2

2

一种方法是使用WCFExtras并将值放在肥皂标题中。

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

这将使令牌在 WSDL 中显而易见,以防服务操作需要它。

另一种选择是使用HTTP 标头,您可以完全不归因于您的方法。这样做的缺点是令牌不会出现在 WSDL 中,因此服务不再完全由 WSDL 描述。

于 2013-04-07T07:09:51.323 回答
2

使用自定义标题解决了这个问题。

您可以像这样为您的客户分配一个自定义标头:

            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;
        }
    }

另请参阅此问题,了解如何通过配置文件设置自定义标头。

于 2013-04-07T22:44:46.757 回答