在iis托管的wcf服务内部传递文化价值 [英] passing culture value inside wcf service hosted by iis

查看:59
本文介绍了在iis托管的wcf服务内部传递文化价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码.

    private IHelloWorld ChannelFactoryWebService()
        {
            ServiceEndpoint tcpEndPoint = new ServiceEndpoint(
                                                ContractDescription.GetContract(typeof(IHelloWorld)),
                                                new NetTcpBinding(),
                                                new EndpointAddress("net.tcp://myserver/CultureTest/Service.svc"));

        ChannelFactory<IHelloWorld> factory = new ChannelFactory<IHelloWorld>(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<String>(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配置如下:

Web config for the hosting site for Service looks as follows:

  <endpointBehaviors>
    <behavior name="Default">
      <CultureExtension/>
    </behavior>
  </endpointBehaviors>

  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

<extensions>
  <behaviorExtensions>
    <add name="CultureExtension" type="Extension.CultureBehaviorExtension, Extension, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

我的问题是,当我浏览网站托管的服务时,在以下代码中,我无法在服务的Hello方法中获得ar-SA的文化价值.我尽力在这里澄清这个问题.请让我知道还有什么需要澄清的.

My question is, inside the following code when I go through the service hosted by website, I am unable to get the culture value of ar-SA inside the Hello method of the service. I tried my best to clarify the question here. Please let me know what else needs to be clarified.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults = true)]
public class Server : IHelloWorld
{
    #region IHelloWorld Members

    public void Hello()
    {
    <--- problem here unable to get culture value of ar-SA here --->
        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服务的方法中设置它呢?

Its not really an answer why that particular code doesnt work, but why dont you just sent in the culture string and set it in your method on the WCF service?

这就是我们通常使用的方式,或者如果它是经过身份验证的用户,只需将其保存在用户上,以便他们可以切换到任何语言,而与计算机配置无关.

Thats the way we usualy do it, or if its an authenticated user, just save it on the user so they can switch to any language regardless of computer config.

这篇关于在iis托管的wcf服务内部传递文化价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆