2009-03-30 6 views
1

ASP.netページからWCFサービスを使用するための良いパターンをアドバイスできますか?クライアント(:ServiceModel.ClientBase)のライフタイムが適切に制御されていないと、PipeExceptionがスローされるようです。現在、Pageクラスのフィールドとして存在していますが、クリーンアップされずに各ページ要求時に再インスタンス化されています(.Closeメソッド)。ASP.netのWCFクライアントPage

この質問は、「ASP.netページの限られたリソースの管理」と言い換えることができますが、おそらくASP.netページのライフサイクルに関連していると思われます。私はASP.netの初心者です。私の理解は少し薄いです。

TIA。

編集:いくつかのコード(!それまであまりありません)

public partial class Default : Page 
{ 
    //The WCF client... obviously, instantiating it here is bad, 
    //but where to instantiate, and where to close? 
    private readonly SearchClient client = new SearchClient(); 


    protected void Page_Load(object sender, EventArgs e) 
    { 

第二編集:以下が良いでしょうか?

+0

あなたは、コードサンプルを提供することはできますか? – bendewey

答えて

1

私はMichael可能であれば、別のレイヤーに抽象化してください。

しかし、aspxページから呼び出す場合は、別のメソッドを作成して呼び出してくださいTSとクリーンアップ。すべてを1か所にまとめることで、コードをきれいに保ちます。最終的にブロックすることを忘れないでください.WCFプロキシは、処分するためにIDisposableにキャストする必要があります。例えば

void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     RemoteCall(); 
    } 
} 

void RemoteCall() 
{ 
var client = new SearchClient(); 
try 
{ 
    var results = client.Search(params); 
    clients.Close(); 
} 
catch(CommunicationException cex) 
{ 
    //handle 
} 
catch(Exception ex) 
{ 
    //handle 
} 
finally 
{ 
    ((IDisposable)client).Dispose(); 
} 

} 
0

通常、プレゼンテーション層から直接外部サービスを呼び出すことはできません。まず、パフォーマンス(プーリング、スケーリングなど)の2つの問題が発生し、認証が必要な場合はセキュリティリスクが発生します(DMZの認証コードが悪い)。

アプリケーション層では、プレゼンテーション層のプライベートサービスへのサービスコールのリファクタリングを考慮する必要があります。これにより、サービスのライフサイクルをページのライフサイクルから切り離すことができます(これは問題のある問題です)。

+0

認証にどのような問題がありますか? WCFはページではなく認証を行います。 –

+0

問題は、認証ソース(LDAP/AD /データベースなど)をインターネットに近づけすぎることです。これにより、簡単にハック可能になります。 –

関連する問題