Предоставление доступа к объекту данных через службу?

#wcf #c#-4.0 #webservice-client

#wcf #c #-4.0 #веб-сервис-клиент

Вопрос:

Я создал службу SOAP, которая должна возвращать объект Category и CategoryCollection с помощью дозвукового запроса. Проблема в том, что я могу вернуть DataTable данных просто отлично, однако объекты, возвращаемые из службы, относятся к типу активной записи, внутренне, а не к моим объектам DAL.

Например, когда я использую сервис, я вижу SOAPService.Категория, но не SOAPService.CategoryCollection (я должен иметь возможность видеть SOAPService.[все другие объекты данных] и SOAPService.Категория имеет активный тип записи и не содержит фактических свойств категории.

Оба класса определены с помощью моего поколения SubSonic DAL.

  namespace TrainingWebService.DAL
 {
     /// <summary>
 // Strongly-typed collection for the Category class.
     /// </summary>
     [Serializable]
     public partial class CategoryCollection : ActiveList<Category, CategoryCollection>
     {  
     .
     .   
     .
 

и

 /// <summary>
/// This is an ActiveRecord class which wraps the Categories table.
/// </summary>
[Serializable]
public partial class Category : ActiveRecord<Category>, IActiveRecord
{
.
.
.    
 

Эти классы существуют в решении TrainingWebService.

Обучающий веб-сервис.ISOAPService.cs:

использование VRPCTrainingWebService.DAL;

пространство имен TrainingWebService { // Обучающий веб-сервис VRPC — интерфейс [ServiceContract] общедоступный интерфейс ISOAPService {

     [OperationContract]
    string GetDBConnectionStringDetails();

    [OperationContract]
    string ReturnSameString(string someString);


    //
    // Database-related
    //

    [OperationContract]                             // categories
    CategoryCollection GetAllCategories();          // SubSonic object

    [OperationContract]
    DataTable GetAllCategoriesAsDataTable();

    [OperationContract]
    DataTable GetCategoryAsDataTable(int id);

    [OperationContract]                             
    Category GetCategoryByID(int id);               // SubSonic object 

    [OperationContract]   
    // products
    ProductCollection GetAllProducts();

    [OperationContract]
    Product GetProductByID(int id);

    [OperationContract]                             // suppliers
    SupplierCollection GetAllSuppliers();

    [OperationContract]
    Supplier GetSupplierByID(int id);



}
 

}

В моем SOAPService.cs

  public CategoryCollection GetAllCategories()            // get a collection of all categories
    {
        return DataCaller.GetAllCategories();
    }

    public DataTable GetAllCategoriesAsDataTable()
    {
        return DataCaller.GetCategoriesAsDataTable();
    }

    public DataTable GetCategoryAsDataTable(int id)
    {
        return DataCaller.GetCategoryAsDataTable(id);
    }


Here's a snip of the DataCaller code.

       /// <summary>
        /// Get all categories - returns a collection of categories
        /// </summary>
        /// <returns></returns>
        public static CategoryCollection GetAllCategories()
        {
            categoryCollection =
                DB.Select().From("Categories")
                    .ExecuteAsCollection<CategoryCollection>();

            return categoryCollection;
        }


        public static DataTable GetCategoryAsDataTable(int id)
        {
            try
            {
                dtResults = new Select()
                                .Where(Category.Columns.CategoryID).IsEqualTo(id)
                                .From(Category.Schema)
                                .ExecuteAsCollection<CategoryCollection>().ToDataTable();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dtResults;
        }
 

Я думаю, что проблема может заключаться в предоставлении доступа к объектам * .DAL через мой веб-сервис, чтобы они были доступны.

У меня это отлично работает в другом решении, которое я создал некоторое время назад, но по какой-то причине я не вижу, чего мне здесь не хватает.

Комментарии:

1. Возможно, был бы применим контракт с данными?

2. Ах да! Я использовал старую версию моего генератора DAL, в которой отсутствовали дополнения CollectionDataContract и DataContract.

3. Да, глупая я. Похоже, это было именно то, что нужно. Я также заметил, что у меня была старая версия Codeplex ( subsonic23tvp.codeplex.com ), которые не поддерживали CollectionDataContract и DataContracts — теперь обновлены. Однако не могу пометить ваш комментарий как ответ.

4. Добавил свой комментарий в качестве ответа, хотя он такой короткий…

Ответ №1:

Не забудьте украсить свои удаленные объекты с помощью [DataContract], если это применимо.

Класс DataContractAttribute

Комментарии:

1. Также добавлены атрибуты CollectionDataContract и Serializable.