2016-08-30 3 views
0

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

Cannot convert source type 'System.TimeSpan' to target type 'MyWebservice.TimeSpan'. 

Вот как TimeSpan называется в моем WebService:

public System.TimeSpan? WaitingTime {get; set;} 

Вот как ссылка WebService обновляется в моем приложении:

private TimeSpan waitingTimeField; 

[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=12)] 
public TimeSpan WaitingTime { 
    get { 
     return this.waitingTimeField; 
    } 
    set { 
     this.waitingTimeField = value; 
     this.RaisePropertyChanged("WaitingTime"); 
    } 
} 

Если я изменяю ссылки на WebService, возникает конфликт между ссылкой и веб-сервисом, что делает невозможным его использование.

Я попытался создать объект типа MyWebService.TimeSpan, и это позволило создать объект WaitingTime, но не может отправлять параметры для объекта, поэтому MyWebService.TimeSpan всегда 00:00:00

EDIT:

Я попытался изменить ссылку WebService на:

private System.Nullable<System.TimeSpan> waitingTimeField; 
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=12)] 
public System.Nullable<System.TimeSpan> WaitingTime 
{ 
    get { 
     return this.waitingTimeField; 
    } 
    set { 
     this.waitingTimeField = value; 
     this.RaisePropertyChanged("WaitingTime"); 
    } 
} 

поэтому проблемы в применении более, но когда я посылаю к WebService заполненный TimeSpan, т он WebService "сбрасывает" его, так что было 00: 03: 02: 1321465 становится 00:00:00

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34281")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")] 
public partial class TimeSpan : object, System.ComponentModel.INotifyPropertyChanged { 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

ответ

0

Одна вещь, которую вы можете сделать, - это послать long вместо TimeSpan, просто для упрощения, а также немного сократите сообщение.

Вы можете конвертировать туда и обратно легко:

var numTicks = someTimeSpan.Ticks; 
var newTimeSpan = TimeSpan.FromTicks(numTicks); 

Насколько вашей проблемы, я считаю, что это потому, что TimeSpan не представляется сериализовать. Я просто сериализовал один, используя XmlSerializer, и он был пуст (<TimeSpan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />).

TimeSpan является неизменным, поэтому я предполагаю, что ваш сериализатор просто не знает, как сериализовать и/или десериализовать его.

+0

Это была не идеальная форма, потому что это вызвало необходимость в нескольких преобразованиях, но это было единственное найденное решение. –

0

Проблема может быть, что вы сделали класс TimeSpan Nullable (знак "?"). Сделать оба параметра TimeSpans (по сервису и клиенту) обнуляемыми или избавиться? и посмотрите, существует ли ошибка с неопределенными Timespans.

+0

Я пробовал это, но когда я принудительно ссылаюсь на Nullable System.TimeSpan, WebService не распознает объект и вызывает метод WS, TimeSpan - 0:00:00 в WS; –

+0

Действительно ли вы используете WCF для своего WebService? Если да, отправьте интерфейс ServiceContract. – Nick