2008-08-08 2 views
7

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

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

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

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

3

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

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

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

0

Вам необходимо использовать 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].

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

Смежные вопросы