Могу ли я передать непримитивный тип данных в WebMethod? - PullRequest
2 голосов
/ 12 ноября 2010

У меня возникла проблема, когда я пытаюсь передать не примитивный (и определяемый пользователем) тип данных в WebMethod.Есть ли определенный способ сделать это?Вот пример моего кода:

[WebMethod]
public bool GetTableRecordCnt(int i, String str, DateTime? lastUpdatedDate, UserDefinedType udt, out FDT_SCHEDULER_STATUS[] schedulerTable)
{
    //code
}

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

"Невозможно прочитать данные из транспортного соединения."

Если я заменим параметр UserDefineType на примитивный тип данных (например, int), клиент сможет получить ответ от WebMethod.

Заранее спасибо за помощь.

РЕДАКТИРОВАТЬ:

Код вызова из клиентского приложения:

UserDefinedType udt = new UserDefinedType();
UserDefinedType1[] tableRecords = ThisApplication.FillArray();

bool result = WebServiceReferenceName.GetTableRecordCnt(1, "tableName", "10/10/2010 12:00:00", udt, out tableRecords);

Это грубое упрощение параметров, которые передаются в веб-метод, но данные, которыев каждом параметре есть то, что будет передано.

Ответы [ 5 ]

1 голос
/ 13 ноября 2010

Это объясняет вашу проблему: Передача пользовательского объекта в веб-службу

Возможно, ваш UserDefinedType содержит "причудливые" вещи, такие как List, Dictionary или что-то, что не может быть сериализовано, поэтому вы получаете ошибку.

Я удивлен, что вы можете передать UserDefinedType таким образом, убедитесь, что вы получите все необходимые свойства, я подозреваю, вы получите много нулевых значений для не примитивных частей.

1 голос
/ 12 ноября 2010

Да, вы можете. Вам нужно будет создать объект, который соответствует общедоступным свойствам вашего UserDefinedType. Это довольно просто, если вы используете .Net webservices и пометили метод как [ScriptMethod ()], который затем будет отвечать на JSON.

Вот пример:

public class UserDefinedType
{
   public int Property1 { get; set; }
   public string Property2 { get; set; }
}

Который вы можете передать как параметр, используя следующий javascript:

var param = "{ Property1 : '"+prop1Val+"', Property2 : '"+prop2Val+"'}";

Обратите внимание, что вы должны объявить JSON-объект, передаваемый в виде строки, так как в противном случае, если вы используете jQuery.ajax (...), он будет сериализовывать ваш объект param в закодированную строку параметров, а не передавать его как собственный JSON строка.

Есть также несколько хороших библиотек, которые позаботятся о том, чтобы объект данных JSON связывался с вами, например jquery-json 2.2 . Используя это, вы можете просто передать параметр как $ .toJSON (param).

Наконец, вот пример отправки запроса в веб-сервис ASP .Net с использованием jquery:

$.ajax({
        type: "POST",
        url: "/Services/YourService.asmx/YourMethod",
        cache: false,
        data: $.toJSON(param), // Convert JSON object to String for Post
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            HandleResponse(response.d)
        },
        error: function (e) {
            alert('error during web service call');
        }
    });
1 голос
/ 12 ноября 2010

Пока у меня есть ответ на мой собственный вопрос. Я изменил подпись метода веб-службы на:

[WebMethod]
public bool GetTableRecordCnt(int i, String str, DateTime? lastUpdatedDate, object udt, out FDT_SCHEDULER_STATUS[] schedulerTable)
{
    //code
}

Обратите внимание, что я изменил тип UserDefinedType на object. Теперь я могу заставить моего клиента общаться с моим веб-сервисом. У кого-нибудь есть причина, по которой этого не следует делать?

0 голосов
/ 16 ноября 2010

ОК, поэтому выяснение, в чем проблема, наконец-то дало мне некоторое облегчение =)

По-видимому, существует ограничение на количество символов, которое может быть названо переменной, когда вы передаете UserDefinedType веб-методу. После тестирования с каждым фрагментом, который я добавил для этой новой функции в моем коде. Я обнаружил, что сокращается следующее имя переменной:

SchedulerRecordCount

до:

SchedRecCnt

теперь позволяет передавать данные между моим приложением для Windows Mobile и веб-службой c #. GO FIGURE!

Теперь, кто-нибудь знает, существует ли конкретное числовое ограничение на количество символов, которое можно использовать для именования переменной в UserDefinedType, которая будет передана в веб-метод, или это может быть проблема среды с моей стороны

0 голосов
/ 12 ноября 2010

Да, это возможно, если ваш тип сериализуемый .

...