Служба WCF - проблема обратной совместимости

Я просто вхожу в создание некоторых служб 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>

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Вам нужно использовать 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].

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