在iis托管的wcf服务中传递文化价值

这是我的代码..

private IHelloWorld ChannelFactoryWebService() { ServiceEndpoint tcpEndPoint = new ServiceEndpoint( ContractDescription.GetContract(typeof(IHelloWorld)), new NetTcpBinding(), new EndpointAddress("net.tcp://myserver/CultureTest/Service.svc")); ChannelFactory factory = new ChannelFactory(tcpEndPoint); factory.Endpoint.Behaviors.Add(new CultureBehaviour()); return factory.CreateChannel(); } [TestMethod] <-------------- FAILING TEST ---- public void ChangingCultureWASViaEndPointTest() { IHelloWorld client = ChannelFactoryWebService(); CultureInfo cultureInfo = new CultureInfo("ar-SA"); Thread.CurrentThread.CurrentCulture = cultureInfo; client.Hello(); string culture = client.HelloCulture(); Assert.AreEqual("ar-SA", culture); <--- fails here.. I get en-US for culture } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults = true)] public class Server : IHelloWorld { #region IHelloWorld Members public void Hello() { Console.WriteLine(string.Format("Hello world from the server in culture {0}", Thread.CurrentThread.CurrentCulture.Name)); } public string HelloCulture() { string cultureName = Thread.CurrentThread.CurrentCulture.Name; return cultureName; } #endregion } [ServiceContract] public interface IHelloWorld { [OperationContract] void Hello(); [OperationContract] string HelloCulture(); } public class CultureMessageInspector : IClientMessageInspector, IDispatchMessageInspector { private const string HeaderKey = "culture"; #region IDispatchMessageInspector Members public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) { int headerIndex = request.Headers.FindHeader(HeaderKey, string.Empty); if (headerIndex != -1) { Thread.CurrentThread.CurrentCulture = new CultureInfo(request.Headers.GetHeader(headerIndex)); } return null; } public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) { } #endregion #region IClientMessageInspector Members public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) { } public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) { request.Headers.Add(MessageHeader.CreateHeader(HeaderKey, string.Empty, Thread.CurrentThread.CurrentCulture.Name)); return null; } #endregion } public class CultureBehaviour : IEndpointBehavior { #region IEndpointBehavior Members public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) { CultureMessageInspector inspector = new CultureMessageInspector(); clientRuntime.MessageInspectors.Add(inspector); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { CultureMessageInspector inspector = new CultureMessageInspector(); endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); } public void Validate(ServiceEndpoint endpoint) { } #endregion } public class CultureBehaviorExtension : BehaviorExtensionElement { // BehaviorExtensionElement members public override Type BehaviorType { get { return typeof(CultureBehaviour); } } protected override object CreateBehavior() { return new CultureBehaviour(); } } 

服务托管站点的Web配置如下所示:

                      

我的问题是,当我通过网站托管的服务时,在下面的代码中,我无法在服务的Hello方法中获得ar-SA的文化值。 我尽力在这里澄清这个问题。 请告诉我还有什么需要澄清的。

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults = true)] public class Server : IHelloWorld { #region IHelloWorld Members public void Hello() {  Console.WriteLine(string.Format("Hello world from the server in culture {0}", Thread.CurrentThread.CurrentCulture.Name)); } public string HelloCulture() { string cultureName = Thread.CurrentThread.CurrentCulture.Name; Console.WriteLine("**************************hello**********************************"); Console.WriteLine(cultureName); return cultureName; } #endregion } 

它不是真正的答案,为什么特定的代码不起作用,但为什么你不发送文化字符串并在WCF服务的方法中设置它?

这就是我们通常这样做的方式,或者如果它是经过身份validation的用户,只需将其保存在用户身上,这样无论计算机配置如何,他们都可以切换到任何语言。