无法将 System.TimeSpan 发送到我的 WebService

Can not send System.TimeSpan to my WebService

在我的 WebService 中,我使用 TimeSpan 将记录保存在我的数据库中,但是在使用 WebService 的应用程序中实例化对象时,我收到以下消息:

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

这就是我的 WebService 中调用 TimeSpan 的方式:

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 的引用,则引用与 Web 服务之间存在冲突,因此无法使用它。

我尝试创建类型为 MyWebService.TimeSpan 的对象,这使得创建 WaitingTime 对象成为可能,但无法为该对象发送参数,因此 MyWebService.TimeSpan 始终是 00:00:00

编辑:

我试图将 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 "resets" 它,所以 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));
        }
    }
}

问题可能是您将 TimeSpan class 设为可为空(“?”符号)。使 TimeSpans(在服务和客户端上)都可以为 null 或摆脱?并查看是否仍然存在不可为 null 的时间跨度的错误。

您可以做的一件事是发送 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 是不可变的,所以我猜你的序列化程序只是不知道如何序列化 and/or 反序列化一个。