WCF + WebService:生成2个字段以表示1个整数

时间:2011-01-10 17:52:31

标签: web-services wcf wcfserviceclient

在我的WCF服务中,我有'int'参数的方法:

    [OperationContract]
    PublishResult PublishEnrollmentProfile(
        string siteName, int methodId,...
        );

当我创建对此WCF服务的WebService引用时,生成了以下签名:

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("...",
        RequestNamespace="...", ResponseNamespace="...",
        Use=System.Web.Services.Description.SoapBindingUse.Literal,
        ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
    public PublishResult PublishEnrollmentProfile(
        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        string siteName,
        int methodId,
        [System.Xml.Serialization.XmlIgnoreAttribute()]
        bool methodIdSpecified, ...)
    {
        object[] results = this.Invoke("PublishEnrollmentProfile", new object[] {
                    siteName,
                    deployServerName,
                    methodId,
                    methodIdSpecified,
                    deviceClass,
                    deviceName,
                    registrationCode});
        return ((PublishResult)(results[0]));
    }

你可以看到,而不是一个整数参数我得到2:整数(对于值)和bool(对于标记'如果指定了值)。

这可以吗?为什么我需要第二个参数(bool)?

非常感谢!

1 个答案:

答案 0 :(得分:3)

指定的“字段仅在结构的可选参数上生成。(int,datetime,decimal等)。所有这些变量都将使用名称Specified生成其他变量。

由于“Specified”字段仅在可选参数上生成,如果将PublishEnrollmentProfile方法的参数放在DataContract中并将methodID上的DataMember属性设置为[DataMember(IsRequired = true)],则指定的字段应该去离开,除非这是一个可选字段,在这种情况下你想要保留原样。

这是一个带有一些样本的blog posting

更新

所以你有了合同。

[OperationContract]
PublishResult PublishEnrollmentProfile(string siteName, int methodId,...);

如果该方法的参数不是可选的,那么您应该创建一个DataContract并重新定义OperationContract,如下所示:

{
   [OperationContract]
   PublishResult PublishEnrollmentProfile(PublishEnrollmentProfileRequest request);
}

然后你有这样的DataContract。

[DataContract]
public class PublishEnrollmentProfileRequest
{
    private string _siteName;
    [DataMember]
    public string siteName
    {
       get;
       set;
    }


    private int _methodId;
    [DataMember(IsRequired=True)]
    public int methodId
    {
       get;
       set;
    }

    .
    .
    .

} 

因此,您有一个“请求”对象,您将其传递到具有siteName和methodId字段的WCF服务。在我提供的示例中,现在需要methodId,这将消除“指定”字段。