我创建了一个与SQL Server建立连接的WCF服务,并返回查询结果。
我的问题是:如何保存来自客户端的请求,而不是为来自客户端的每个请求建立连接?
我想要的场景是:
由于
答案 0 :(得分:1)
从http://msdn.microsoft.com/en-us/magazine/cc163590.aspx开始,您可以使用每会话服务:
[AttributeUsage(AttributeTargets.Interface|AttributeTargets.Class, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
{
public bool Session {get;set;}
... // More members
}
会话默认为false。要支持会话,您需要在合同级别将Session设置为true: [ServiceContract(Session = true)] 界面IMyContract {...}
要完成配置,您需要指示Windows Communication Foundation在整个会话期间保持服务实例处于活动状态,并将客户端消息定向到该会话。通过将ServiceBehavior属性的InstanceContextMode属性设置为InstanceContextMode.PerSession来实现此本地行为方面,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract {...}
每会话服务和ClientService代码
[ServiceContract(Session = true)]
interface IMyContract
{
[OperationContract]
void MyMethod();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract,IDisposable
{
int m_Counter = 0;
MyService()
{
Trace.WriteLine("MyService.MyService()");
}
public void MyMethod()
{
m_Counter++;
Trace.WriteLine("Counter = " + m_Counter);
}
public void Dispose()
{
Trace.WriteLine("MyService.Dispose()");
}
}
客户代码
MyContractProxy proxy = new MyContractProxy();
proxy.MyMethod(); proxy.MyMethod();
proxy.Close();
客户端和服务都可以通过在绑定中设置不同的值来配置不同的超时。支持可靠传输级会话的绑定为ReliableSession属性提供了用于配置空闲超时的InactivityTimeout属性。例如,以下显示了以编程方式为TCP绑定配置30秒空闲超时所需的代码:
NetTcpBinding tcpSessionBinding = new NetTcpBinding();
tcpSessionBinding.ReliableSession.Enabled = true;
tcpSessionBinding.ReliableSession.InactivityTimeout = TimeSpan.FromSeconds(30);
以下是使用配置文件的等效配置设置:
<netTcpBinding>
<binding name="TCPSession">
<reliableSession enabled="true" inactivityTimeout="00:00:30"/>
</binding>
</netTcpBinding>
答案 1 :(得分:0)
客户端缓存与SQL Server的连接。假设您使用HTTPS来保护传输,那么您应该让客户端在每次请求时都发送凭据。如果您组成相同的连接字符串,则可能使用缓存连接。
老实说,我会避免在会话中捕获它;但是,这也是可能的。客户端 - 服务器协议应始终保持无状态。
如果你没有使用HTTPS,那么你就完全不安全了,你也可以一起删除密码要求,只允许任何人查询他们想要的任何数据。