Служба 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>
Кто-нибудь может посоветовать, пожалуйста?
Ответов (3)3
Хорошо, нам нужно было решить эту проблему в ближайшее время, и поэтому мы пришли к идее «уровня взаимодействия» или уровня совместимости.
Как правило, все, что мы сделали, это добавили к проекту традиционную веб-службу 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]
.
Ваш файл конфигурации не должен изменяться.