在每次调用时将数据传递给WCF
如何在每次调用WCF服务时传递字符串(没有singleton)。例如,我需要在每次调用时传递CultureInfo字符串。 在Remoting的早期,我使用从客户端传递数据,比如在每次调用时将数据传递给WCF,wcf,appdomain,Wcf,Appdomain,如何在每次调用WCF服务时传递字符串(没有singleton)。例如,我需要在每次调用时传递CultureInfo字符串。 在Remoting的早期,我使用从客户端传递数据,比如 CallContext.LogicalSetData("CultureInfo", "en-Us") 并在服务器中检索(在不同的appdomain中运行),如 这在WCF中不起作用。CallContext.LogicalGetData始终为空。不幸的是,在WCF中,这并不那么容易。但是,您可以对所有操作执行一次。您可
CallContext.LogicalSetData("CultureInfo", "en-Us")
并在服务器中检索(在不同的appdomain中运行),如
这在WCF中不起作用。CallContext.LogicalGetData始终为空。不幸的是,在WCF中,这并不那么容易。但是,您可以对所有操作执行一次。您可以实现,它允许您在发送请求之前修改每个请求。然后添加自定义消息头。请注意,这是Soap消息头,而不是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;
}
在服务器端,实现
公共对象AfterReceiveRequest(参考System.ServiceModel.Channel.Message请求,
IClientChannel频道,InstanceContext(InstanceContext)
{
字符串区域性=request.Headers.GetHeader(“CultureInfo”,
"http://mynamespace");
Thread.CurrentThread.CurrentCulture
=CultureInfo.CreateSpecificCulture(文化);
返回null;
}
您还需要实现一些自定义行为来应用消息检查器。要实现这些行为,请参阅MSDN页面:
谢谢你,罗伯特。我使用上面的示例作为endpointbehvior(添加到serives端点)和customattribute(用customattribute装饰接口契约)实现了它。两者都可以独立工作。使用一个比另一个有什么好处吗?很高兴它起作用了。我认为端点行为的优点是可以通过配置添加。属性实现需要重新编译。如果在部署后需要将行为添加到客户机中,该行为可能更可取。另一方面,该属性对于稍后阅读代码的其他人来说更清晰。
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;
}
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;
}