每次调用都将数据传递给WCF

时间:2013-12-18 13:54:05

标签: wcf appdomain

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

CallContext.LogicalSetData("CultureInfo", "en-Us")

并在服务器中检索(在不同的appdomain中运行),如

CallContext.LogicalGetData("CultureInfo").

这在WCF中无效。 CallContext.LogicalGetData始终为null。

1 个答案:

答案 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