在每次调用时将数据传递给WCF

在每次调用时将数据传递给WCF,wcf,appdomain,Wcf,Appdomain,如何在每次调用WCF服务时传递字符串(没有singleton)。例如,我需要在每次调用时传递CultureInfo字符串。 在Remoting的早期,我使用从客户端传递数据,比如 CallContext.LogicalSetData("CultureInfo", "en-Us") 并在服务器中检索(在不同的appdomain中运行),如 这在WCF中不起作用。CallContext.LogicalGetData始终为空。不幸的是,在WCF中,这并不那么容易。但是,您可以对所有操作执行一次。您可

如何在每次调用WCF服务时传递字符串(没有singleton)。例如,我需要在每次调用时传递CultureInfo字符串。 在Remoting的早期,我使用从客户端传递数据,比如

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