1

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

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

ティア。

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

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)
    {

2回目の編集:次のほうがよいでしょうか?

public partial class Default : Page
{
    private SearchClient client;


    protected void Page_Unload(object sender, EventArgs e)
    {
        try
        {
            client.Close();
        }
        catch
        {
            //gobbled
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        client= new SearchClient();
        //.....
4

2 に答える 2

1

私はマイケルに同意します。可能であれば、別のレイヤーに抽象化します。

ただし、aspx ページから呼び出す場合は、別のメソッドを作成して呼び出し、その結果を返し、クリーンアップします。すべてを 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();
 }

}
于 2009-04-08T03:08:03.903 に答える