#c# #web-services #logging #soap
#c# #веб-сервисы #ведение журнала #soap
Вопрос:
Мне интересно, каков наилучший способ возврата данных клиенту, где данные в некотором роде похожи. У нас есть требование разрешить клиентам подключаться к нашему программному обеспечению с помощью метода SOAP, и мы вернем все «события», которые произошли с конкретным объектом.
Например, в интернет-магазине событиями могут быть добавление товара в корзину, размещение заказа, оплата заказа. В этом примере наше программное обеспечение будет использовать следующую структуру классов:
public class Event
{
public Guid Id { get; set; }
public DateTime EventTime { get; set; }
public string Username { get; set; }
public string Message { get; set; }
}
public class ProductEvent : Event
{
public string ProductId { get; set; }
}
public class OrderEvent : Event
{
public ICollection<Product> Products { get; set; }
public string OrderId { get; set; }
}
На данный момент мы можем создавать XML-файлы, которые могут выглядеть следующим образом
<Events>
<ProductEvent>
<Id>0000-0000-0000-0000</Id>
<EventTime>01-01/-0001T00:00:00</EventTime>
<Username>User</Username>
<Message>Added to basket</Message>
<ProductId>00001</ProductId>
</ProductEvent>
<ProductEvent>
<Id>0000-0000-0000-0000</Id>
<EventTime>01-01/-0001T00:00:00</EventTime>
<Username>User</Username>
<Message>Added to basket</Message>
<ProductId>00002</ProductId>
</ProductEvent>
<OrderEvent>
<Id>0000-0000-0000-0000</Id>
<EventTime>01-01/-0001T00:00:00</EventTime>
<Username>User</Username>
<Message>Added to basket</Message>
<OrderId>000001</OrderId>
<Products>
<ProductId>00001</ProductId>
<ProductId>00002</ProductId>
</Products>
</OrderEvent>
</Events>
Возможно ли вернуть этот тип данных через SOAP из одного метода, или для каждого типа события должны быть отдельные методы?
Т. е. могу ли я вернуть что-то похожее на вышеупомянутое, вызвав метод с возвращаемым IList<Event>
использованием SOAP?
Есть ли лучший способ ведения журнала событий, чем этот? Единственный способ, который я мог придумать, — это иметь только Event
класс, содержащий всю информацию в свойстве Description, что сильно затруднило бы поиск, поскольку вам пришлось бы искать свойство, записанное в текст?
Редактировать
Следовало бы упомянуть, что при попытке вернуть объект, IList<Event>
из которого может быть получено содержимое, Event
возникает ошибка на клиенте:
An existing connection was forcibly closed by the remote host
Есть ли способ сделать то, что я пытаюсь, или, если нет, есть ли лучший метод или шаблон проектирования, которому следует следовать.
Комментарии:
1. Вы пробовали это? Что происходит, когда вы возвращаете список<Событие> из своего веб-сервиса?
2. @Mike sorry должен был включить это.
3. Это должно сработать, когда вы используете класс коллекции вместо интерфейса. Вместо
IList<T>
amp;ICollection<T>
используйтеList<T>
.