Как переписать клиент WCF для использования ChannelFactory вместо ссылки на сервис - PullRequest
0 голосов
/ 29 марта 2011

У меня есть служба WCF, созданная с использованием фабрики программного обеспечения веб-службы . Все мои входящие запросы и возвращенные ответы реализуются как контракты сообщений. Я получал доступ к сервису, добавив ссылку на сервис в VS, которая работала нормально. Однако теперь мне сказали, что это не стандартный способ компании, и что мне нужно вызывать службу, используя собственный прокси-класс WCF, основанный на System.ServiceModel.ChannelFactory.

Я никогда не использовал ChannelFactory прежде, и я изо всех сил пытаюсь найти лучший способ переписать клиентский доступ. Контракт на обслуживание генерируется фабрикой сервисов, и мне нужно предоставить интерфейс сервиса для вспомогательного класса прокси. Вот часть договора на обслуживание - всего около 25 операций на обслуживание:

namespace CAEWCFService.ServiceContracts
{
  /// <summary>
  /// Service Contract Class - CAEServiceContract
  /// </summary>
  [WCF::ServiceContract(Namespace = "urn:CAEServiceServiceContracts", Name = "CAEServiceContract", SessionMode = WCF::SessionMode.Allowed, ProtectionLevel = ProtectionLevel.None )]
  public partial interface ICAEServiceContract 
  {
    [WCF::OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "GetAllIncomes", ProtectionLevel = ProtectionLevel.None)]
    CAEService.MessageContracts.GetAllIncomesReponse GetIncomeRecords(CAEService.MessageContracts.GetAllIncomesRequest request);

    [WCF::OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "urn:CAEServiceServiceContracts.CAEServiceContract.GetSecurityRecords", ProtectionLevel = ProtectionLevel.None)]
    CAEService.MessageContracts.GetAllSecuritiesResponse GetSecurityRecords(CAEService.MessageContracts.GetAllSecuritiesRequest request);

    //... the rest
  }
}

А вот вызов со стороны клиента, вызывающий операцию GetIncomeRecords:

CAEServiceContractClient client = new CAEServiceContractClient();    

IncomeSearchItem item = new IncomeSearchItem()
{
    aCode = aCode.Text,
    bCode = bCode.Text,
    sCode = sCode.Text,
    secDesc = tbSecurityName.Text,
    status = statusValue != 0 ? statusValue : 0,
    fromDate = fromDate,
    toDate = toDate,
    IncomeID = 0,
    userBank = userBank,
    userId = userId,
    currentRate = currentSourceVal != 0 ? currentSourceVal : 0,
    dateConfirmed = ddDate.SelectedValue,
    pageIndex = pageIdx,
    pageSize = recordsPerPage
};

GetAllIncomesReponse response = new GetAllIncomesReponse();

try
{
    response = client.GetIncomeRecords(item);
    totalRecords = response.TotalRecords;

    incomelist.DataSource = response.IncomeItemColl;
    incomelist.DataBind();

    //.. the rest
}

Вот пример кода из другого проекта, показывающий, как использовать прокси-помощник. Проблема с моим сервисом заключается в том, что он ожидает и возвращает контракты сообщений, тогда как образец передается в примитивных типах и возвращает примитивы или наборы данных:

public static class ServiceHelper
{
  /// <summary>
  /// Services the verification.
  /// </summary>
  /// <param name="user">The user.</param>
  /// <returns></returns>
  public static string ServiceVerification(string user)
  {
    return WCFProxyHelper<IFCAServices>.Use(client =>
      client.ServiceVerification(user));
  } 
}

Так какой самый быстрый / самый простой способ сделать это? Как мне сообщить ChannelFactory о моем IncomeSearchItem и нескольких других объектах, которые мне нужно передать службе? Могу ли я использовать svcutil для генерации всех объектов и использовать это в ChannelFactory?

1 Ответ

1 голос
/ 29 марта 2011

Вы говорите, что «Фирменный путь» состоит в том, чтобы использовать служебный помощник и что он внутренне создает прокси на основе ChannelFactory - или вы хотите создать свой собственный прокси-класс? Будет ли это работать для вас? Метод расширения в ServiceHelper позволит вам продолжать использовать корпоративный путь, но не потребует изменения ServiceHelper, чтобы узнать о ваших запросах / ответных сообщениях или обо всем, что они содержат.

using CAEService;
using CAEService.MessageContracts;

public static class ServiceHelperExtensions
{
    public static GetAllIncomesReponse GetIncomeRecords(this ServiceHelper, GetAllIncomesRequest request)
    {
        return WCFProxyHelper<ICAEServiceContract>.Use(client =>
            client.GetAllIncomes(request));
    }
}

Затем в клиентском коде вы должны заменить это:

 response = client.GetIncomeRecords(item);

с этим:

response = ServiceHelper.GetIncomeRecords(item);

Я думаю, вам также придется использовать команду SVCUTIL.exe для генерации прокси-класса, а затем отредактировать результат, удалив прокси-сервер и оставив только классы запроса / ответа и их вспомогательные типы. Кроме того, если вы уже выполнили «Добавить ссылку на службу» в VS, вы можете выбрать опцию «Показать все файлы» в обозревателе решений и перейти к ссылке на службу. Один из этих файлов содержит сгенерированный прокси-сервер службы и поддерживающие его типы в одном файле.

...