Клиентский прокси WCF для клиента ASP .NET - PullRequest
0 голосов
/ 31 августа 2010

Мне нужны советы о том, как лучше всего создать прокси-оболочку для клиента WCF для клиента ASP .NET. Я хочу одинаково хорошо работать с элементом управления ObjectDataSource без дополнительного кодирования, а также когда мне нужно вручную вызвать службу WCF, чтобы получить некоторые данные. Я в основном придумал две модели, но я хотел бы знать, какая из них более эффективна.

Вот первая клиентская оболочка

public class Facade1 : IDisposable
{
   private readonly IClient proxy = ClientProxyFactory.GetObject<IClient>();

   public List<string> GetData()
   {
      proxy.GetData()
   }

   public List<string> GetMoreData()
   {
      proxy.GetMoreData()
   }

   public void Dispose()
   {
       ClientProxyFactory.CloseChannel(this.proxy);
   }
}

Теперь вот еще одна оболочка WCF.

public class Facade2
{
   public List<string> GetData()
   {
        IClient proxy = ClientProxyFactory.GetObject<IClient>();

        try
        {
            return client.GetData();
        }
        finally
        {
            ClientProxyFactory.CloseChannel(proxy);            
        }
   }

   public List<string> GetMoreData()
   {
        IClient proxy = ClientProxyFactory.GetObject<IClient>();

        try
        {
            return client.GetMoreData();
        }
        finally
        {
            ClientProxyFactory.CloseChannel(proxy);            
        }
   }
}

В первом примере есть только один экземпляр клиентского прокси, и его можно повторно использовать между различными методами, но класс должен реализовать IDisposable, чтобы клиент мог правильно расположить прокси. Во втором примере есть один клиентский прокси на метод, и клиент не беспокоится об утилизации прокси.

Является ли повторное использование прокси между разными методами хорошим способом? Есть ли снижение производительности при открытии / закрытии прокси WCF? (В обоих примерах предположим, что ChannelFactory кэшируется и каждый раз создается новый канал с помощью метода cached_factory.CreateChannel ().)

Например, с первой оберткой я могу сделать что-то вроде:

using (Facade1 facade = new Facade1())
{
   facade.GetData()
   ...
   ...
   facade.GetMoreData()
}

Во втором примере я могу просто создать экземпляр своего фасада и вызвать необходимые методы, не беспокоясь об утилизации прокси.

Заранее спасибо,

Эрик

1 Ответ

1 голос
/ 31 августа 2010

Если вы используете эту оболочку для нескольких вызовов службы WCF при обработке одного HTTP-запроса в приложении ASP.NET, чем модель с общим прокси лучше. Если вы хотите поделиться оболочкой (сделать ее глобальной), тогда следует использовать вторую модель.

Производительность воссоздания прокси зависит от типа используемой привязки и ее конфигурации. Например, в случае BasicHttpBinding воссоздание прокси может быть быстрым, поскольку все еще может существовать постоянное соединение HTTP с предыдущим прокси. Но в случае WSHttpBinding с контекстом безопасности воссоздание прокси означает новое подтверждение безопасности для установления сеанса безопасности.

...