1

任何人都可以建议从 ASP.net 页面使用 WCF 服务的良好模式吗?似乎如果 Client(:ServiceModel.ClientBase) 的生命周期没有得到适当的控制,我们就会抛出 PipeException。它目前作为 Page 类的一个字段存在,但在每个页面请求时都被重新实例化,而不被清理(.Close 方法)。

我怀疑这个问题可以改写为“管理 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)
    {

第二次编辑:以下会更好吗?

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 页面调用它,我只需创建一个单独的方法来调用它,返回其结果并进行清理。通过将所有代码集中在一个地方来保持代码整洁。请记住在您的 finally 块中进行处理,并且必须将 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 回答
0

通常,您不应直接从表示层调用外部服务。它产生了两个问题:首先,性能(池化、扩展等),其次,如果您需要进行身份验证,它会产生安全风险(DMZ 中的身份验证代码是错误的。

即使您没有应用程序层,您也应该考虑将服务调用重构为表示层中的私有服务。这将允许您将服务的生命周期与页面的生命周期分离(正如您所说,这是有问题的)。

于 2009-03-30T16:18:44.660 回答