Клиент WCF на странице ASP.net - PullRequest
1 голос
/ 30 марта 2009

Может кто-нибудь посоветовать хороший шаблон для использования службы WCF со страницы ASP.net? Кажется, что если время жизни клиента (: 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)
    {

2nd Edit: Будет ли лучше следующее?

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();
        //.....

Ответы [ 2 ]

1 голос
/ 08 апреля 2009

Я согласен с Майклом, если это возможно, абстрагируйте его в другой слой.

Однако, если вы собираетесь вызывать его со своей страницы 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();
 }

}
0 голосов
/ 30 марта 2009

В общем, вы не должны вызывать внешние сервисы напрямую с уровня презентации. Это создает две проблемы: во-первых, производительность (объединение в пул, масштабирование и т. Д.), А во-вторых, создает угрозу безопасности, если вам необходимо пройти аутентификацию (код аутентификации в вашей демилитаризованной зоне плох.

Даже если у вас нет уровня приложения, вам следует рассмотреть возможность рефакторинга вызова службы в частную службу на уровне презентации. Это позволит вам отделить жизненный цикл службы от жизненного цикла страницы (что, как вы заявили, проблематично).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...