Сколько времени должен занимать вызов wcf из Compact Framework на Windows Mobile?

#c# #wcf #compact-framework

#c# #wcf #compact-framework

Вопрос:

Я вызываю сервисный метод wcf с параметром int, и он возвращает объект order, как показано ниже. Для возврата объекта требуется около 1,5 секунды — это нормально или слишком медленно для WCF? Объект имеет 1 Order, 2 OrderLines и 1 OrderLineModifier.

 [DataContract]
[KnownType(typeof(OrderLine))]
public class OrderDTO
{


    public OrderDTO()
    {
        this.OrderLines= new OrderLineDtos();
    }

    [DataMember]
    public ObjectState State { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public int? TableId { get; set; }

    [DataMember]
    public byte OrderStateId { get; set; }

    [DataMember]
    public byte OrderTypeId { get; set; }

    [DataMember]
    public string OrderCounter { get; set; }

    [DataMember]
    public DateTime OrderDateTime { get; set; }

    [DataMember]
    public DateTime LastStateDateTime { get; set; }

    [DataMember]
    public int? SalesPersonId { get; set; }

    [DataMember]
    public int MachineId { get; set; }

    [DataMember]
    public string Comments { get; set; }

    [DataMember]
    public decimal Value { get; set; }

    [DataMember]
    public decimal VatValue { get; set; }

    [DataMember]
    public string OrderIdentifier { get; set; }

    [DataMember]
    public int? CustomerId { get; set; }

    [DataMember]
    public byte[] Timestamp { get; set; }

    [DataMember]
    public bool IsPrinted { get; set; }

    [DataMember]
    public int? WorkShiftId { get; set; }

    [DataMember]
    public decimal TotalValue { get; set; }

    [DataMember]
    public int? EmployeeId { get; set; }

    [DataMember]
    public OrderLineDtos OrderLines { get; set; }

}

[CollectionDataContract]
public class OrderLineDtos : List<OrderLineDTO>
{

}
[DataContract]
[KnownType(typeof(OrderLineModifier))]
public class OrderLineDTO
{

    public OrderLineDTO()
    {
        this.OrderLineModifiers = new List<OrderLineModifierDTO>();
    }

    [DataMember]
    public ObjectState State { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public int OrderId { get; set; }

    [DataMember]
    public byte OrderLineStateId { get; set; }

    [DataMember]
    public System.DateTime LastStateDateTime { get; set; }

    [DataMember]
    public int ProductId { get; set; }

    [DataMember]
    public string ProductCode { get; set; }

    [DataMember]
    public string ProductName { get; set; }

    [DataMember]
    public decimal Quantity { get; set; }

    [DataMember]
    public decimal UnitPrice { get; set; }

    [DataMember]
    public decimal UnitPriceWithVatValue { get; set; }

            [DataMember]
    public decimal VatRate { get; set; }

    [DataMember]
    public decimal DiscountValue { get; set; }

    [DataMember]
    public decimal VatValue { get; set; }

    [DataMember]
    public decimal DiscountPercent { get; set; }

    [DataMember]
    public decimal LineTotal { get; set; }

    [DataMember]
    public string Comments { get; set; }

    [DataMember]
    public byte[] Timestamp { get; set; }

    [DataMember]
    public bool IsTreated { get; set; }

    [DataMember]
    public short? VatRateId { get; set; }

    [DataMember]
    public List<OrderLineModifierDTO> OrderLineModifiers { get; set; }

}



[DataContract]
public partial class OrderLineModifierDTO
{

    [DataMember]
    public ObjectState State { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public int OrderLineId { get; set; }

    [DataMember]
    public int MenuItemOptionId { get; set; }

    [DataMember]
    public decimal Quantity { get; set; }

    [DataMember]
    public decimal UnitPrice { get; set; }

    [DataMember]
    public int MesureUnitId { get; set; }

    [DataMember]
    public string Comments { get; set; }

} 
  

Спасибо!

Ответ №1:

1,5 секунды может быть в самый раз (вы обсуждаете возможную передачу больших объемов данных на мобильное устройство) или это может быть очень медленно. Что вам нужно сделать, это начать уменьшать «проблему» скорости, чтобы увидеть, является ли это проблемой. Выясните, сколько данных передается, чтобы увидеть, связано ли это просто со временем передачи (медленная сеть и т.д.) Выясните, намного ли более производительно подключение из настольного приложения (что привело бы к передаче или обработке на стороне клиента). Выясните, большую часть времени занимает сервер. Если последнее верно, профилируйте свой код, чтобы выяснить, есть ли где-нибудь узкое место.

Мы не можем сказать вам, хорошая это производительность или нет, потому что у нас есть только одна из тысячи переменных. В общем, вот то, что сделало бы его синхронизацию нормальной:

  • Передача больших объемов данных
  • Длительное время обработки (много работы на сервере)
  • Время обработки клиентом (после его поступления предстоит много работы)

Вот вещи, которые могут замедлять работу этой службы:

  • Медленная база данных
  • Задержка в сети или узкие места
  • Проблемы с клиентской памятью
  • Неоптимизированный серверный код
  • Неизвестные задержки где-то в процессе (ожидание другой службы и т.д.)

Вам нужно будет провести полное расследование, чтобы выяснить, что на самом деле означает 1,5 секунды. Вы можете обнаружить, что это отличное время, или вы можете обнаружить, что можете сделать это намного быстрее.

Ответ №2:

Время складывается из:

  • Подключение из источника (CF) к целевому (серверу)
  • Преобразование объектов в чистые данные (желательно XML)
  • Отправка данных через интернет-соединение из источника в цель
  • Преобразование чистых данных в объекты (C #)
  • Метод обработки на сервере
  • Преобразование объектов в чистые данные (на сервере)
  • Отправка данных через интернет-соединение от цели к источнику
  • Преобразование чистых данных в объекты (на CF)
  • Таким образом, любой шаг может занять много времени.

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

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

1. Требуется чуть больше половины секунды, чтобы вернуть только строку «test».

2. Итак, попробуйте вернуть что-нибудь большое.

3. Я думаю, что ваш ответ ближе к моему вопросу! Но если бы это было возможно, я бы установил aswered и для BiggsTRC. Спасибо!

Ответ №3:

Одна вещь, которую вы можете сделать, чтобы уменьшить узкое место в производительности, — это посмотреть, сколько времени требуется для вызова службы с компьютера, на котором эта служба запущена. Если это занимает 0,25 секунды, то вы знаете, что у вас есть 1,25 секунды времени передачи / обработки клиентом. Если это занимает 1,45 секунды, тогда вы можете сказать «ок, 500 миллисекунд по сети — это довольно быстро».