如何在每次调用WCF服务(没有单例)时传递字符串。例如,我需要在每次调用时传递CultureInfo字符串。 在Remoting早期,我用来传递来自客户端的数据,如
CallContext.LogicalSetData("CultureInfo", "en-Us")
并在服务器中检索(在不同的appdomain中运行),如
CallContext.LogicalGetData("CultureInfo").
这在WCF中无效。 CallContext.LogicalGetData始终为null。
答案 0 :(得分:1)
不幸的是在WCF中,它并不那么容易。但是,您可以对所有操作执行一次。您可以实现IClientMessageInspector,允许您在发送之前修改每个请求。然后添加自定义邮件标题。请注意,这是一个Soap Message Header而不是HTTP头。
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,
System.ServiceModel.IClientChannel channel)
{
request.Headers.Add(MessageHeader.CreateHeader("CultureInfo",
"http://mynamespace", Thread.CurrentThread.CurrentUICulture.Name));
return null;
}
在服务器端,实施IDispatchMessageInspector
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
IClientChannel channel, InstanceContext instanceContext)
{
string culture = request.Headers.GetHeader<string>("CultureInfo",
"http://mynamespace");
Thread.CurrentThread.CurrentCulture
= CultureInfo.CreateSpecificCulture(culture);
return null;
}
您还需要实现一些自定义行为来应用消息检查器。有关实现这些行为的信息,请参阅MSDN页面:
http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector.aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.idispatchmessageinspector%28v=vs.110%29.aspx