SQL Server に接続してクエリの結果を返す WCF サービスを作成しました。
私の問題は、クライアントからのリクエストを保存して、クライアントからのリクエストごとに接続しないようにするにはどうすればよいですか?
私が望むシナリオは次のとおりです。
- クライアントに SQL Server のユーザーとパスワードを入力し、サーバーに接続します (データを暗号化する必要がありますか??)
- セッションを 30 秒間維持します。
ありがとう
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)] interface 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>
SQL Serverへの接続は、クライアントによってキャッシュされます。トランスポートを保護するためにHTTPSを使用していると仮定すると、すべての要求でクライアントに資格情報を送信させる必要があります。同じ接続文字列を作成する場合、キャッシュされた接続を使用する可能性があります。
正直なところ、セッションでそれをキャプチャしようとするのは避けたいと思います。ただし、これも可能です。クライアント/サーバープロトコルは、可能な限り常にステートレスのままにする必要があります。
HTTPSを使用していない場合は、完全に安全ではないため、パスワード要件をすべて削除して、誰でも必要なデータをクエリできるようにすることをお勧めします。