Служба WCF с 4 входными и 3 выходными параметрами переупорядочивается путем добавления ссылки на службу в проекте класса прокси - PullRequest
2 голосов
/ 07 декабря 2011

Я посмотрел в SO и в других местах и ​​видел вопросы, задаваемые по этому поводу, а также некоторые ответы, которые все еще не имеют смысла для меня в моем случае.

Я рефакторинг моего рабочего решения VStudio 2010, которое имеет:

  • один проект с веб-сервисом ASMX
  • другой отдельный проект для прокси-класса (здесь нет кода, кроме того, что генерируется Добавить веб-ссылку
  • другой отдельный проект для клиента (содержит ссылку на ProxyClass.dll

Новое решение VStudio 2010 содержит:

  • один проект библиотеки служб типа WCF длясам по себе контракт ( IFileService.cs ) один проект библиотеки служб типа WCF для реализации контракта ( FileService.cs )
  • другой отдельный проект дляпрокси-класс (здесь нет кода, кроме того, что генерируется Добавить ссылку на службу
  • другой отдельный проект для клиента (содержит ссылку на WCFProxyClass.dll)

Вот контракт, который заканчивается тремя выходными параметрами (и реализация того же порядка того же порядка):

[ServiceContract(Name = "IFileService", Namespace =  "http://www.cbmiweb.com/TrimWCF/2011/11")]
public interface IFileService
{
    [OperationContract]
        public string DownloadFile(string trimURL
         , string TrimRecordNumber
         , string CallerPC
         , string RequestorID
         , out byte[] docContents
         , out string returnFiletype
         , out string returnFilename)
    {

Вот что Добавить ссылку на службусгенерировано в моем проекте класса прокси:

public string DownloadFile(
  out byte[] docContents
, out string returnFiletype
, out string returnFilename
, string trimURL
, string TrimRecordNumber
, string CallerPC
, string RequestorID) 
{
    return base.Channel.DownloadFile(out docContents, out returnFiletype, out returnFilename, trimURL, TrimRecordNumber, CallerPC, RequestorID);
}

Я прочитал ответы в диапазоне от «вы не можете использовать parms в WCF» до «вы не должны использовать Add Service Reference, но вместо этого используйте svcutil.exe» для «порядок параметров не имеет значения ... он все равно будет работать ".

Я не понимаю, что делать здесь (и что я сделал не так, что привело к этому измененному порядку и ПОЧЕМУ это произошло).

1 Ответ

2 голосов
/ 07 декабря 2011

Прежде всего, вы не сделали ничего плохого :).Несмотря на то, что подписи в методах на клиенте и на сервере различны, они эквивалентны сообщениям, которые они будут производить / потреблять.Вы можете использовать этот прокси-класс без каких-либо проблем, и он должен работать так же хорошо.

Почему это происходит, это другая история - в описании сервиса (WSDL) есть два «сообщения» для каждого (неодносторонняя) операция: одна с входными параметрами, одна с выходными параметрами.Сообщения содержат соответственно входные данные и выходные данные операции, но в WSDL нет ничего, что указывало бы их порядок.Поэтому, когда такой инструмент, как Add Service Reference или svcutil, генерирует клиентский прокси, он просто «выберет» один заказ (сначала из параметров), но запрос, который прокси отправит службе, будет совместим с тем, что ожидает сервер.(а также ответ от сервера будет правильно понят прокси-сервером).

Если вы хотите сохранить порядок параметров, вы можете создать прокси-класс самостоятельно.Для этого вы можете использовать класс ChannelFactory<T> или создать свой собственный класс клиента, производный от ChannelBase<T>.Но вам не нужно этого делать, как я упоминал ранее.

...