Веб-ссылка VS2003 для службы WCF имеет дополнительный параметр "IdSpecified"
Я разрабатываю службу WCF с использованием VSTS 2008 + .Net 3.5 + C#, и она отлично работает, когда я также использую VSTS 2008 для разработки клиента (с помощью функции Добавить ссылку на службу для автоматического создания прокси-кода клиентских веб-служб). WCF, который я разработал, использует basicHttpBinding.
Проблема, с которой я столкнулся, заключается в том, что когда я использую Visual Studio.Net (Visual Studio 2003) для генерации прокси-кода клиентских веб-сервисов, для метода OperationContract есть дополнительный входной параметр IdSpecified (тип bool). Я проверил, что при указании IdSpecified для true значение параметра Id будет правильно передаваться на сторону сервера WCF, но когда я указываю IdSpecified в значение false, независимо от того, какие значения я указываю для параметра Id, на стороне сервера WCF Id будет всегда 0. Я также пытался ввести тип входного параметра, например строку, такого дополнительного входного параметра на стороне клиента нет.
У меня вопрос, почему есть дополнительный параметр? Каково его значение и можно ли избежать генерации такого дополнительного параметра?
Вот Visual Studio.Net автоматически сгенерированный код прокси веб-служб на стороне клиента,
public StudentInfo Poll(int Id, [System.Xml.Serialization.XmlIgnoreAttribute()] bool IdSpecified)
Вот мой VSTS 2008 WCF серверный код,
[OperationContract]
StudentInfo Poll(int Id);
РЕДАКТИРОВАТЬ 1: здесь часть автоматически сгенерированного кода на стороне клиента о методе опроса.
[return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public StudentInfo Poll(int Id, [System.Xml.Serialization.XmlIgnoreAttribute()] bool IdSpecified) {
object[] results = this.Invoke("Poll", new object[] {
Id,
IdSpecified});
return ((StudentInfo)(results[0]));
}
2 ответа
Джордж,
Такое поведение разработано и существует с.NET 1.0. Фактически, если бы вы создали веб-сервис ASMX с VS2003 с той же сигнатурой метода, вы бы получили тот же результат.
Проблема связана с типами значений, которые помечены в WSDL как необязательные. Так как они являются типами значений, они не могут возвращать ноль (а VS2003 не имел обнуляемых типов). Решение, которое реализовала Microsoft, заключалось в добавлении отдельного логического поля или свойства, которое вы можете задать, чтобы указать, предоставляете ли вы значение.
Это означает, что когда ваше приложение.NET 1.1 хочет вызвать службу, ему необходимо установить параметр IdSpecified:
using (WebReference1.PollService svc = new WebReference1.PollService()) {
StudentInfo info = svc.Poll(id, true); // True to specify
}
Я не пробовал это, но почему бы вам не
[DataContract]
public class PollParameters {
[DataMember(Required = true)]
public int Id;
}
[OperationContract]
public StudentInfo Poll(PollParameters parameters);
Попробуйте и посмотрите, как выглядит прокси в VS2003.
Вы можете попробовать использовать DataContract вместо простого целочисленного параметра. Контракт с данными позволяет вам указать, требуется ли член или нет, что, если член требуется, может удалить этот странный дополнительный бул.