Question

Dans mon service WCF je méthode avec le paramètre 'int':

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

Quand je créé référence WebService à ce service WCF la signature suivante a été générée:

    [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]));
    }

Vous pouvez voir que, au lieu d'un entier paramètre j'ai 2:. Entier (pour la valeur) et bool (pour la marque « si la valeur a été spécifiée)

Est-ce ok? Pourquoi ai-je besoin du 2ème paramètre (bool)?

Merci beaucoup!

Était-ce utile?

La solution

« spécifié champs ne sont générés sur les paramètres optionnels qui sont struct. (Int, datetime, décimal, etc.). Toutes les variables telles auront variable supplémentaire généré avec le nom spécifié.

Étant donné que les champs « spécifiées » ne sont générées sur les paramètres optionnels, si vous avez placé les paramètres de la méthode PublishEnrollmentProfile à l'intérieur d'un DataContract et définissez l'attribut DataMember sur methodID à [DataMember (IsRequired = true)] le champ spécifié devrait aller loin, à moins que ce champ est facultatif dans ce cas, vous voulez laisser comment il est.

Voici un blog avec quelques échantillons.

UPDATE

Alors vous avez votre contrat d'exploitation.

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

Si les paramètres de cette méthode ne sont pas en option, vous devez créer un DataContract et redéfinissent la OperationContract comme ceci:

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

Et vous avez votre DataContract comme ça.

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


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

    .
    .
    .

} 

Vous avez donc un objet « demande » que vous passez dans le service WCF qui a des champs siteName et methodID. Dans l'exemple que j'ai fourni methodID est maintenant nécessaire, cela elminate le champ « spécifié ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top