Передайте и получите объект с ASMX WebService - PullRequest
0 голосов
/ 03 августа 2011

У нас есть такой веб-сервис:

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public object[] DoSmt(object[] inParams)
{
    List<object> rsl = new List<object>();
    rsl.Add(DateTime.Now);
    rsl.Add(new CallResult());
    return rsl.ToArray();
}

CallResult класс определен в веб-сервисе.Мы вызываем этот метод из WinForms (перед этим мы добавляем веб-ссылку на этот веб-сервис):

Service svc = new Service();
object[] arrRsl = svc.DoSmt(new object[] { "hi there", "hello" });

Получаем исключение:

Приложение не знает, как десериализоватьCallResult

Но если мы добавим в веб-службу такую ​​забавную функцию, как эта:

[WebMethod(EnableSession = true)]
public void Fun(CallResult abc)
{
    // Do nothing
}

, тогда все в порядке.Это потому, что CallResult не появляется в файле WSDL перед добавлением забавной функции, потому что он не появляется ни в одном WebMethod.

Вопрос: Как сообщить C # для генерации CallResultв файле WSDL, даже если он явно не используется ни в одном WebMethod.Мы используем VS2005.

Спасибо.

1 Ответ

0 голосов
/ 20 декабря 2011

Вы можете пометить класс с помощью GenerateScriptTypeAttribute .

В некоторых случаях, даже если тип соответствует входному параметру или возвращаемое значение метода веб-службы, прокси не будет сгенерирован автоматически. В этом случае вы должны использовать Атрибут GenerateScriptTypeAttribute для создания объекта прокси для тип.

[GenerateScriptType(typeof(ColorObject), ScriptTypeId = "Color")]
[WebMethod]
public string[] GetDefaultColor()
{
    // Instantiate the default color object.
    ColorObject co = new ColorObject();

    return co.rgb;
}
...