Могут ли сведения о унаследованных классах быть возвращены при вызове из метода SOAP, возвращающего базовый класс?

#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> .