Добавлены дополнительные параметры в веб-методы - PullRequest
2 голосов
/ 15 ноября 2011

Я читаю некоторые MethodInfo с прокси, сгенерированного из wsdl.

Один из методов имеет три (int) параметра и тип возврата int, но когда я исследую ParameterInfo[], я на самом деле вижу восемь параметров:

  • Int32,
  • Boolean,
  • Int32,
  • Boolean,
  • Int32,
  • Boolean,
  • Int32&,
  • Boolean&

Откуда берутся эти дополнительные параметры?

ОБНОВЛЕНИЕ

Для более подробной информации код в сгенерированном прокси выглядит следующим образом:

  /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/IInleerAppService/AddThreeNumbers", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public void AddThreeNumbers(int one, [System.Xml.Serialization.XmlIgnoreAttribute()] bool oneSpecified, int two, [System.Xml.Serialization.XmlIgnoreAttribute()] bool twoSpecified, int three, [System.Xml.Serialization.XmlIgnoreAttribute()] bool threeSpecified, out int AddThreeNumbersResult, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool AddThreeNumbersResultSpecified) {
    object[] results = this.Invoke("AddThreeNumbers", new object[] {
                one,
                oneSpecified,
                two,
                twoSpecified,
                three,
                threeSpecified});
    AddThreeNumbersResult = ((int)(results[0]));
    AddThreeNumbersResultSpecified = ((bool)(results[1]));
}

Почему это так?

ОБНОВЛЕНИЕ

Если вы, как и я, ошиблись этим, вы можете легко избежать отображения этих дополнительных параметров, просто применив следующий фрагмент кода:

if (!parameterInfo[i].Name.EndsWith("Specified") && !parameterInfo[i].IsRetval && !parameterInfo[i].Name.EndsWith("Result"))
{
    // magic
}

1 Ответ

3 голосов
/ 15 ноября 2011

Я недавно выяснил это для себя. В некоторых случаях это связано с minoccurs=0 в XSD. Прокси-класс WCF не использует обнуляемые типы, поэтому XmlSerializer не может определить, хотите ли вы или не хотите отправлять определенное поле.

Вы можете установить one, но оно не будет отправлено. Вы также должны установить oneSpecified на true, чтобы сериализатор сериализовал значение one и отправил его.

Дополнительная информация здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...