您的位置:首页 > 其它

跟着Artech学习WCF(3) wcf 的状态问题

2011-09-03 16:44 393 查看
开始以为是wcf的session问题 敲了一边代码发现里面没有用session存储数据 经过 自己研究才发现作者是再将wcf的状态存储问题

项目结构如下





 

代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Contract;

namespace Client
{
class Program
{
static void Main(string[] args)
{

ChannelFactory<ICalculator> calculatorChannelFactory = new ChannelFactory<ICalculator>("httpEndpoint");
Console.WriteLine("Create a calculator proxy: proxy1");
ICalculator proxy1 = calculatorChannelFactory.CreateChannel();
Console.WriteLine("Invocate  proxy1.Adds(1)");
proxy1.Adds(1);
Console.WriteLine("Invocate  proxy1.Adds(2)");
proxy1.Adds(2);
Console.WriteLine("The result return via proxy1.GetResult() is : {0}", proxy1.GetResult());
try
{
proxy1.Adds(1);
}
catch (Exception ex)
{
Console.WriteLine("It is fail to invocate the Add after terminating session because \"{0}\"", ex.Message);
}
//(proxy1 as ICommunicationObject).Close();

Console.WriteLine("Create a calculator proxy: proxy2");
ICalculator proxy2 = calculatorChannelFactory.CreateChannel();
Console.WriteLine("Invocate  proxy2.Adds(1)");
proxy2.Adds(1);
Console.WriteLine("Invocate  proxy2.Adds(2)");
proxy2.Adds(2);
Console.WriteLine("The result return via proxy2.GetResult() is : {0}", proxy2.GetResult());
//(proxy2 as ICommunicationObject).Close();
Console.Read();

}
}
}


=================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Contract
{

[ServiceContract(SessionMode=SessionMode.Required)]
public interface ICalculator
{
//调用任何允许初始化会话服务方法(缺省情况下所有的服务方法都自动初始化Session,也就是 IsInitiating=true)。
//调用任何包含 "IsTerminating=true" 声明的服务方法(缺省情况下所有的服务方法 IsTerminating=false,需要我们显示声明)。
// Terminating 终止意思  Initiating 启动的意思
[OperationContract(IsOneWay=true,IsInitiating=true,IsTerminating=false)]
void Adds(double x);

[OperationContract(IsInitiating = false, IsTerminating = true)]
double GetResult();

}
}


========================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Sevice;
using System.ServiceModel;

namespace Hosting2
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
{
host.Opened += delegate
{
Console.WriteLine("The Calculator service has begun to listen");
};
host.Open();
Timer timer = new Timer(delegate { GC.Collect(); }, null, 0, 100);
Console.Read();
}
}
}
}


===========

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Contract;
using System.ServiceModel;
namespace Sevice
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService:ICalculator
{

public CalculatorService()
{
Console.WriteLine("Calculator object has been created");
}

~CalculatorService()
{
Console.WriteLine("Calculator object has been destoried");
}

private double _result;
void ICalculator.Adds(double x)
{
Console.WriteLine("The Add method is invoked and the current session ID is: {0}", OperationContext.Current.SessionId);
this._result += x;

}

double ICalculator.GetResult()
{
Console.WriteLine("The GetResult method is invoked and the current session ID is: {0}", OperationContext.Current.SessionId);
return this._result;

}
}
}


 

 

客户端配置如下

<system.serviceModel>
<client>
<endpoint address="http://localhost:9999/SessionfulCalculator"
binding="wsHttpBinding" contract="Contract.ICalculator"
name="httpEndpoint" />
</client>
</system.serviceModel>


服务端配置如下

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="CalculatorBehavior" name="Sevice.CalculatorService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration=""
contract="Contract.ICalculator" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:9999/SessionfulCalculator" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: