#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], если это применимо.
Комментарии:
1. Также добавлены атрибуты CollectionDataContract и Serializable.