我刚刚开始创建一些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 票数:3 已采纳

好的,我们需要在短期内解决这个问题,因此我们提出了“互操作”或兼容层的想法。

实际上,我们所做的只是为项目添加了传统的ASMX Web服务,并使用本机WCF调用从中调用了WCF服务。 然后,我们能够将适当的类型返回给客户端应用程序,而无需进行大量的重新分解工作。 我知道这是一个hacky解决方案,但它是我们拥有如此庞大的遗留代码库的最佳选择。 而且额外的好处是它实际上运作得非常好。 :)

===============>>#2 票数:3

啊,这是在杀我! 我大约3个月前在工作中这样做了,现在我记不起所有的细节了。

但是,我确实记得你需要basicHttpBinding,而你不能使用新的序列化程序(这是默认的); 你必须使用“旧的”XmlSerializer。

不幸的是,我不再在我做这个的地方工作,所以我不能去看代码。 我会打电话给我的老板,看看我能挖掘什么。

===============>>#3 票数: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]进行修饰。

您的配置文件不需要更改。

  ask by ZombieSheep translate from so

未解决问题?本站智能推荐: