我真的需要知道如何在不向我的所有合同添加额外参数的情况下将令牌传递给WCF服务,其中一些值类似于数字,以便我可以在以后的服务中使用它。
答案 0 :(得分:2)
一种方法是使用WCFExtras并将值放在soap标题中。
[SoapHeader("MyToken", typeof(Header), Direction = SoapHeaderDirection.In)]
[OperationContract]
string In();
如果服务的操作需要,这将使WSDL中的令牌显而易见。
另一种选择是使用HTTP headers,您可以在不使用方法的情况下进行操作。这样做的缺点是令牌没有出现在WSDL中,因此WSDL不再完整地描述该服务。
答案 1 :(得分:1)
使用自定义标头解决了此问题。
您可以为客户端分配自定义标题,如下所示:
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;
}
}
另请参阅this question了解如何通过配置文件设置自定义标头。