将令牌传递给WCF服务
本文关键字:服务 WCF 令牌传递 | 更新日期: 2023-09-27 18:07:45
我真的需要知道如何将令牌传递给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描述。