【问题标题】:wcf instance variable getting changed by a separate instancewcf 实例变量被单独的实例更改
【发布时间】:2013-01-31 23:36:08
【问题描述】:

我有一个配置为:

ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerSession

我有一个全局定义的变量,我希望在整个会话期间保持它的值,并且它正在保持那个值。

我有一个实例初始化这个变量并保存它的值(比如 123) 我有另一个实例初始化这个变量并保存它的值(比如 456)

但是,第二个实例初始化变量后,第一个实例(会话)的值变成了456!!没想到!!

这里有什么我遗漏的吗?

【问题讨论】:

  • 变量是如何定义的?是静态的吗?
  • 你能告诉我们有问题的代码吗?

标签: .net wcf concurrency


【解决方案1】:

它应该可以正常工作 - 重新检查您的代码,如下所示。

服务合同:

[ServiceContract]
public interface IService1
{       
    [OperationContract]
    string GetData();      
}

服务实现

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
    int i = 0;

    public string GetData()
    {
        i++;
        return string.Format("Instance number: {0}", i);
    }       
}

现在使用相同的实例调用服务将从 GetData 中增加 "int i" 的值,但对于新实例,它将从 1 开始。

见下面来自客户的电话

using (var client = new HttpProxy.Service1Client("NetTcpBinding_IService1"))
{
    Console.WriteLine("Response {0}", client.GetData());
    Console.WriteLine("Response {0}", client.GetData());
}

using (var client2 = new HttpProxy.Service1Client("NetTcpBinding_IService1"))
{
    Console.WriteLine("Response {0}", client2.GetData());
    Console.WriteLine("Response {0}", client2.GetData());
}

using (var client = new HttpProxy.Service1Client("WSHttpBinding_IService1"))
{
    Console.WriteLine("Response {0}", client.GetData());
    Console.WriteLine("Response {0}", client.GetData());
}

使用 CreateChannel 创建代理实例

var binding = new NetTcpBinding();
                    var address = new EndpointAddress("net.tcp://localhost:8523/Service1");
                    var channelFactory = new ChannelFactory<WcfServLib.IService1>(binding, address);

                    WcfServLib.IService1 proxy = channelFactory.CreateChannel();

                    Console.WriteLine(proxy.GetData());
                    Console.WriteLine(proxy.GetData());


                    channelFactory = new ChannelFactory<WcfServLib.IService1>(binding, address);
                    proxy = channelFactory.CreateChannel();

                    Console.WriteLine(proxy.GetData());
                    Console.WriteLine(proxy.GetData());

                    channelFactory.Close();

服务实现

    [ServiceBehavior(InstanceContextMode= InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)] public class Service1 : IService1 { int i = 0; public string GetData()
    {
        return string.Format("SessionID:{0}, Local variable i:{1}", OperationContext.Current.SessionId, i++);
    }        
}

【讨论】:

  • 我正在使用以下代码创建实例 Dim myBinding As NetTcpBinding myBinding = New NetTcpBinding(SecurityMode.None, False) Dim oChannelFactory As New ChannelFactory(Of MasterWCF.ICaseflowWCFService)(myBinding) myBinding.ReceiveTimeout = New TimeSpan(10, 10, 10, 10) myBinding.MaxReceivedMessageSize = 2147483647 oChannelFactory.Endpoint.Address = New EndpointAddress(NetTcpAddress) Dim 代理 As MasterWCF.IWCFService proxy = oChannelFactory.CreateChannel()
  • 查看我的更新答案 我已经给出了使用 CreateChannel 创建代理实例的示例。
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多