Как передать объект (ObjectProxy) из Flex обратно в .NET WebService? - PullRequest
1 голос
/ 01 августа 2011

Итак, в Интернете много статей о том, как обращаться с .NET WebMethod, который возвращает DataSet или DataTable. Вот пример:

Обработка результатов веб-службы, которые содержат .NET DataSets или DataTables

Итак, я знаю, как использовать result.Tables.<tablename>.Rows и тому подобное. Но что я не могу понять или найти в Интернете, так это как пойти в другом направлении - метод передачи объектов или таблиц обратно в .NET Webservice из Flex, без наклона к передаче XML в виде строки или создания огромных Методы веб-службы, которые имеют один параметр для каждого свойства / столбца хранимого объекта. Конечно, другие, умнее меня, решили эту проблему.

Я использую типизированные наборы данных ASP.NET 2.0, и было бы неплохо, если бы я мог просто передать один объект или массив объектов из Flex в веб-службу, заполнить свой типизированный DataTable и выполнить обновление () через соответствующий типизированный TableAdapter. Моя мечта была бы [WebMethod] чем-то вроде этого:

public void SaveObject(TypedDataTable objToSave) { ... } 
public void SaveObject(TypedDataSet objToSave) { ... }

У меня есть типизированные таблицы данных, сохраняемые в базе данных, я знаю, как выполнить эту часть и даже несколько уловок, но у нас было XML, передаваемый взад и вперед в виде строки - eww , Я пытаюсь перейти на более объектный подход.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Лучший объектный подход - AMF .Я полагаю, что в вашем цикле разработки, возможно, немного поздно изменить уровень интеграции, но в противном случае я не знаю, как обойти маршалинг ваших объектов обратно в XML или разделить их на примитивные компоненты.

Для .NET реализации AMF посмотрите:

Удивительно, насколько легко все становится после использования AMF, например, с использованием инфраструктуры MVC Mate и вызовом AMF, передающим сложный объект на сервер, выглядит примерно так:

<mate:RemoteObjectInvoker instance="yourWebservice"  method="saveComplexObject" showBusyCursor="true" >
    <mate:resultHandlers>
        <mate:CallBack method="saveComplexObjectSuccess" arguments="{[resultObject]}" />
    </mate:resultHandlers>
    <mate:faultHandlers>
        <mate:MethodInvoker generator="{DataManager}" method="presentFault" arguments="{fault}" />
    </mate:faultHandlers>
</mate:RemoteObjectInvoker>

С обработчиками результатов и ошибок, которые необязательны.

0 голосов
/ 10 августа 2011

Направление, которое я выбрал, было близко к тому, на что я надеялся, но возможно, но этого достаточно, чтобы я посчитал предложение SuperSaiyen использовать AMF / ORM лучшим решением для новых / новых проектов.

Для примера / обсуждения, скажем, я работаю с таблицей Person в базе данных, и у меня есть типизированный набор данных с именем PeopleDataSet, который имеет PersonTableAdapter и PersonDataTable.

READ будет выглядеть следующим образом в веб-сервисе .NET:

[WebMethod] 
public PeopleDataSet.PersonDataTable GetAllPeople() {
    var adapter = new PersonTableAdapter();
    return adapter.GetData();
}

... который в Flex даст вам result объект, который вы можете использоватькак это:

// FLEX (AS3)
something.dataProvider = result.Tables.Person.Rows;

Проверьте ссылку, которую я вставил в вопрос, чтобы узнать больше о том, как Flex справляется с этим.

CREATE / UPDATE - Это частьЯ должен был выяснить, и почему я задал этот вопрос.Сначала Flex на этот раз:

// FLEX (AS3)
var person:Object = { 
    PersonID: -1,                // -1 for CREATE, actual ID for UPDATE
    FirstName: "John", 
    LastName: "Smith", 
    BirthDate: "07/19/1983",
    CreationDate: "1997-07-16T19:20+01:00" // need W3C DTF for Date WITH Time
};
_pplWebSvcInstance.SavePerson(person); // do the web method call

(Об обработке этих дат W3C см. Как проанализировать дату в формате ISO во Flex (AS3)? )

Вкл.Что касается веб-службы .NET, то хитрость заключалась в том, чтобы выяснить правильный тип параметра веб-метода.Если вы просто наберете Object, а затем войдете в вызов с помощью отладчика, вы увидите, что .NET считает, что это XmlNode[].Вот то, что я рассчитывал сделать:

[WebMethod]
public int SavePerson(PeopleDataSet p) {
    // Now 'p' will be a PeopleDataSet with a Table called 'p' that has our data
    // row(s) (just row, in this case) as string columns in random order.
    // It WILL NOT WORK to use PeopleDataSet.PersonDataTable as the type for the
    // parameter, that will always result in an empty table. That is why the 
    // LoadFlexDataTable utility method below is necessary.

    var adapter = new PersonTableAdapter();
    var tbl = new PeopleDataSet.PersonDataTable();
    tbl.LoadFlexDataTable(p.Tables[0]); // see below

    // the rest of this might be familiar territory for working with DataSets
    PeopleDataSet.PersonRow row = tbl.FirstOrDefault();
    if (row != null) {
        if (row.PersonID > 0) {  // doing UPDATE
            row.AcceptChanges();
            row.SetModified();
        }
        else {  // doing CREATE
            row.CreationDate = DateTime.UtcNow; // set defaults here
            row.IsDeleted = false;
        }
        adapter.Update(row); // database call
        return row.PersonID;
    }
    return -1;
}

Теперь, утилита Kluge, которую вы видели выше, называется.Я сделал это как метод расширения, который является необязательным:

    // for getting the Un-Typed datatable Flex gives us into our Typed DataTable
    public static void LoadFlexDataTable(this DataTable tbl, DataTable flexDataTable)
    {            
        tbl.BeginLoadData();
        tbl.Load(flexDataTable.CreateDataReader(), LoadOption.OverwriteChanges);
        tbl.EndLoadData();

        // Probably a bug, but all of the ampersand (&) in string columns will be
        // unecessarily escaped (&amp;) - kluge to fix it.
        foreach (DataRow row in tbl.Rows)
        {
            row.SetAdded(); // default to "Added" state for each row
            foreach (DataColumn col in tbl.Columns) // fix &amp; to & on string columns
            {
                if (col.DataType == typeof(String) && !row.IsNull(col))
                    row[col] = (row[col] as string).Replace("&amp;", "&");
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...