У меня есть служба 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?