在.NET 2.0客户端中更改了WCF服务参数

时间:2009-08-24 07:41:14

标签: wcf

我创建了一个WCF服务,该服务公开了一个包含一个参数的方法:

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

该服务定义了两个端点(wsHttpBinding和basicHttpBinding),以便与旧客户端兼容。

该服务在.NET 3.0和.NET 3.5客户端应用程序中运行良好。但是,当我创建.NET 2.0客户端时,GetData方法需要2个参数:整数(预期)和名为valueSpecified(意外)的bool参数。我从未定义过第二个参数。为什么会发生这种情况?如何摆脱第二个参数?

3 个答案:

答案 0 :(得分:3)

由于值类型不能为null(在.net框架的后一版本中没有Nullable<T>)VS除了生成其他参数以使您无法指定值类型之外,您可以调用您的服务方法像这样。

service.GetData(val,true);

请参阅this帖子,John Saunders建议在该属性中添加[DataMember(Required = true)]属性。

答案 1 :(得分:1)

完全相同的问题已发布here

在使用.NET 2.0时,避免在客户端代理上生成额外布尔参数的另一种方法是在服务契约中切换到 RPC样式的enconding (WCF和ASMX的默认值)是文件样式) 这样,客户端上的 XmlSerializer 将确保参数始终出现在SOAP请求中,因为它是SOAP 1.1规范的一部分,在使用RPC时强制执行样式编码。

在WCF中,您可以使用DataContractFormat属性在服务或操作级别指定编码样式。

[ServiceContract]
public interface IService
{
    [OperationContract]
    [DataContractFormat(Style = OperationFormatStyle.Rpc)]
    string GetData(int value);
}

有关SOAP中RPC样式和文档样式编码之间差异的更多信息,请参见here

在任何情况下,请仔细考虑更改服务合同的含义,因为它可能会破坏与任何现有客户的兼容性。

答案 2 :(得分:0)

您可以在代理类中的GetData操作中手动删除valueSpecified属性。