Служба WCF - проблема обратной совместимости - PullRequest
7 голосов
/ 08 августа 2008

Я только начинаю создавать некоторые службы WCF, но у меня есть требование сделать их обратно совместимыми с устаревшими (.NET 1.1 и 2.0) клиентскими приложениями.

Мне удалось настроить службы для правильной работы для клиентов 3.0 и выше, но когда я публикую службы с использованием конечной точки basicHttpBinding (которая, по моему мнению, необходима для необходимой мне совместимости), служба реорганизует сигнатуры моих методов. например,

public bool MethodToReturnTrue(string seedValue);

отображается для клиентских приложений как

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);

Я перепробовал все параметры конфигурации, которые я могу найти в app.config для моего консольного приложения с собственным хостингом, но я не могу выполнить эту функцию, как ожидалось. Я предполагаю, что это может привести к тому, что мои ожидания ошибочны, но я был бы удивлен, что служба WCF не способна обработать тип возврата bool клиенту нижнего уровня.

Мой текущий app.config выглядит следующим образом.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
        <clear />
        <endpoint address="http://localhost:8080/CSMEX"    binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Может кто-нибудь посоветовать, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 19 августа 2008

ОК, нам нужно было решить эту проблему в краткосрочной перспективе, и поэтому мы пришли к идее «взаимодействия» или уровня совместимости.

По большому счету все, что мы сделали, это добавили в проект традиционную веб-службу ASMX и вызвали службу WCF, используя собственные вызовы WCF. Затем мы смогли вернуть соответствующие типы обратно клиентским приложениям без значительного объема работы по рефакторингу. Я знаю, что это было хакерское решение, но это был лучший вариант, который у нас был с такой большой унаследованной кодовой базой. И дополнительным бонусом является то, что он на самом деле работает на удивление хорошо. :)

3 голосов
/ 10 августа 2008

Ах, это убивает меня! Я сделал это на работе около 3 месяцев назад, и теперь я не могу вспомнить все детали.

Однако я помню, что вам нужен basicHttpBinding, и вы не можете использовать новый сериализатор (который используется по умолчанию); Вы должны использовать «старый» XmlSerializer.

К сожалению, я больше не работаю в том месте, где я это делал, поэтому я не могу посмотреть код. Я позвоню своему боссу и посмотрю, что я могу откопать.

0 голосов
/ 28 сентября 2010

Вы должны использовать XmlSerializer. Например:

[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService {
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
    bool MethodToReturnTrue(string seedValue);
}

Необходимо вручную задать имя действия операции, поскольку автоматически созданное имя WCF создается не так, как имя действия ASMX (WCF также включает имя интерфейса, а ASMX - нет).

Все используемые вами контракты с данными должны быть отмечены [XmlType], а не [DataContract].

Ваш конфигурационный файл не должен изменяться.

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