Arhn - архитектура программирования

Могу ли я передать непримитивный тип данных в WebMethod?

У меня возникла проблема, когда я пытаюсь передать непримитивный (и определяемый пользователем) тип данных в 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);

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

12.11.2010

  • какую платформу использует ваше клиентское приложение? winforms или asp.net? 12.11.2010
  • Клиентское приложение использует winforms для устройства Windows Mobile 5.0. 12.11.2010
  • Выложил код вызова. 12.11.2010

Ответы:


1

Да, ты можешь. Вам нужно будет создать объект, который соответствует общедоступным свойствам вашего UserDefinedType. Это довольно просто, если вы используете веб-сервисы .Net и пометили метод как [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');
        }
    });
12.11.2010
  • К сожалению, это мало помогает. Я не использую JSON и JQUERY для этого проекта. 12.11.2010
  • @AndHeCodedIt: когда вы задавали свой вопрос, вы не совсем поняли, используете ли вы Windows Forms или ASP .Net. С подходом Windows Form у вас должна быть установка прокси-класса SOAP, которая позволяет вам создавать прокси-объект для пользовательского типа. Просто помните, что это только общедоступные свойства, которые отображаются туда и обратно. 12.11.2010
  • спасибо за информацию, не хотел Вас оскорбить, если Вас оскорбили. Я также поставил +1, потому что ваш ответ был бы полезен в других приложениях =) 12.11.2010
  • @AndHeCodedIt: без проблем, не оскорбляю :-) 12.11.2010

  • 2

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

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

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

    12.11.2010

    3

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

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

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

    12.11.2010
  • Странно то, что определяемый пользователем тип не содержит причудливых вещей. Он просто содержит примитивные типы данных (строки). Еще более странной частью этой проблемы является то, что этот определяемый пользователем тип передается веб-службе чаще, чем я пытаюсь это сделать, и операция работает просто отлично. Странно, похоже, что я что-то не так делаю. 15.11.2010
  • @AndHeCodedIt, как вы можете сказать, что это прошло больше раз, чем вы пытаетесь? может быть, проблема в вашей технике отладки? 15.11.2010
  • В моем веб-сервисе есть два других метода, которые принимают этот пользовательский тип. Они существуют более 6 месяцев без каких-либо проблем. Когда я вызываю один из двух существующих веб-методов и передаю определенный пользователем тип, веб-служба успешно возвращает информацию. Когда я вызываю свой новый метод веб-службы и передаю определенный пользователем тип, я не получаю ответа от веб-службы. Это яснее? 15.11.2010
  • @AndHeCodedIt - есть вероятность, что виноват какой-то другой параметр? Может быть, какой-то код в самом веб-методе? 15.11.2010
  • Не то, чтобы я мог найти. Я поместил операторы отладки (наша собственная строка журнала печатает в файл) в строке кода сразу после обработки, которая должна войти в веб-метод. Вместо того, чтобы видеть оператор отладки, который я должен видеть с сервера, я получаю сообщение об ошибке на стороне клиента, говорящее мне, что он не может прочитать из транспортного соединения. Кажется, что моя клиентская сторона истекает, потому что она не может видеть Метод веб-сервиса. Имейте в виду, что мой новый метод является перегрузкой предыдущего метода, который работает. Единственная новая часть — мой новый параметр userDefinedType. 15.11.2010
  • @AndHeCodedIt - еще одна идея ... проверьте автоматически сгенерированный файл Reference.cs, когда у вас есть UserDefinedType ... вы видите там тип? Что происходит, когда вы F12 это? Я пытаюсь понять, может быть, проблема связана с VS при создании ссылки. 15.11.2010
  • Когда я нажимаю F12, он находит userDefinedType, созданный в Reference.cs. 15.11.2010
  • Хорошо, я вижу одно существенное различие между классом, определенным в исходном коде, и классом, определенным в Reference.cs. Переменные в классе Reference.cs используют тип данных string (нижний регистр), однако в исходном коде userDefinedType ожидает тип String (верхний регистр). Вы видите в этом проблему? 15.11.2010
  • @AndHeCodedIt: Не понимаю, как это может вызвать какие-либо проблемы. Это как int и Int32 — оба одинаковы, int является псевдонимом истинного типа Int32. Позвольте мне понять, у вас уже все работает нормально, используя трюк, который вы опубликовали? Или что-то все же не так с кодом? 16.11.2010
  • @Shadow Wizard, да. У меня еще есть немного времени, чтобы понять, в чем настоящая проблема. Я сделаю репост, когда разберусь. Спасибо за вашу помощь. 16.11.2010
  • @Волшебник теней. Пожалуйста, смотрите мое редактирование моего ответа. Я был ошеломлен тем, что обнаружил проблему, и очень расстроен тем, что потратил столько времени, пытаясь понять, в чем была настоящая проблема =(. Спасибо за все ваши комментарии. 16.11.2010


  • 5

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

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

    SchedulerRecordCount
    

    to:

    SchedRecCnt
    

    теперь позволяет передавать данные между моим мобильным приложением Windows и веб-службой С#. ИДИТЕ РИСУНОК!

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

    16.11.2010
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..