Служба WCF - проблема с обратной совместимостью
-
08-06-2019 - |
Вопрос
Я только приступаю к созданию некоторых сервисов 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>
Кто-нибудь может посоветовать, пожалуйста?
Решение 2
Хорошо, нам нужно было решить эту проблему в краткосрочной перспективе, и поэтому мы пришли к идее "взаимодействия", или уровня совместимости.
Фактически, все, что мы сделали, это добавили в проект традиционный веб-сервис ASMX и вызвали из него службу WCF, используя собственные вызовы WCF.Затем мы смогли вернуть соответствующие типы обратно в клиентские приложения без значительного объема работы по повторному факторингу.Я знаю, что это было хакерское решение, но это был лучший вариант, который у нас был с такой большой устаревшей кодовой базой.И дополнительным бонусом является то, что это действительно работает на удивление хорошо.:)
Другие советы
Ах, это убивает меня!Я сделал это на работе около 3 месяцев назад, и сейчас я не могу вспомнить всех деталей.
Однако я помню, что вам нужна привязка BasicHttpBinding, и вы не можете использовать новый сериализатор (который используется по умолчанию);вы должны использовать "старый" XmlSerializer.
К сожалению, я больше не работаю в том месте, где я это делал, поэтому я не могу пойти посмотреть на код.Я позвоню своему боссу и посмотрю, что смогу раскопать.
Вам действительно нужно использовать 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]
.
Ваш конфигурационный файл не должен нуждаться в изменении.