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

StackOverflow https://stackoverflow.com/questions/4649788

Вопрос

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

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

Когда я создал ссылку на веб-сервис к этой службе 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 (для знака «если указано значение).

Это нормально? Почему мне нужен 2-й параметр (Bool)?

Большое спасибо!

Это было полезно?

Решение

Указанные «поля» генерируются только по необязательным параметрам, которые являются структурами. (Int, datetime, degimal etc). Все такие переменные будут иметь дополнительную переменную, созданную с указанным именем.

Поскольку «указанные» поля генерируются только при необязательных параметрах, если вы поместили параметры для метода publishenrollmentProfile внутри datacontract и установите атрибут DataMember на методид на [DataMember (isrequired = true)], указанное поле должно уйти, если Это необязательное поле, в этом случае вы хотели бы оставить его, как это так.

Вот а Разведка блога с некоторыми образцами.

ОБНОВИТЬ

Таким образом, у вас есть ваш контракт на работу.

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

Если параметры этого метода не являются необязательными, вам следует создать DataContratt и переопределить операциюContract, как:

{
   [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 и FeatherId. В приведенном мне предусмотрено IFEREDID, это будет Elminate «Указанное» поле.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top