0

在我的 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)?

非常感谢!

4

1 回答 1

3

指定”字段仅在结构的可选参数上生成。(int、datetime、decimal 等)。所有此类变量都将生成名为 Specified 的附加变量。

由于“指定”字段仅在可选参数上生成,如果您将 PublishEnrollmentProfile 方法的参数放在 DataContract 内并将 methodID 上的 DataMember 属性设置为 [DataMember(IsRequired=true)] 指定字段应该消失,除非这是一个可选字段,在这种情况下您希望保持原样。

这是一个包含一些示例的博客文章。

更新

所以你有你的运营合同。

[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,这将消除“指定”字段。

于 2011-01-10T18:31:29.993 回答