WCF + WebService: 2 поля генерируются для представления 1 целого числа
-
09-10-2019 - |
Вопрос
В моей службе 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 «Указанное» поле.