WCF + WebService: генерируются 2 поля для представления 1 целого числа - PullRequest
0 голосов
/ 10 января 2011

В моей службе WCF у меня есть метод с параметром 'int':

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

Когда я создал ссылку WebService на эту службу WCF, была сгенерирована следующая подпись:

    [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 Ответ

3 голосов
/ 10 января 2011

Заданные "поля создаются только для необязательных параметров, которые являются структурами. (Int, datetime, decimal и т. Д.). У всех таких переменных будет дополнительная переменная, созданная с именем Specified.

Поскольку поля «Заданные» создаются только для необязательных параметров, если вы поместили параметры для метода PublishEnrollmentProfile в DataContract и задали для атрибута DataMember для methodID значение [DataMember (IsRequired = true)], указанное поле должно перейти прочь, если только это необязательное поле, в этом случае вы захотите оставить все как есть.

Вот блог с некоторыми примерами.

UPDATE

Итак, у вас есть контракт на эксплуатацию.

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

    .
    .
    .

} 

Итак, у вас есть объект «request», который вы передаете в службу WCF с полями siteName и methodId. В приведенном мною примере methodId теперь требуется, это исключит поле «Указано».

...