在Silverlight中从服务器传输到客户端时丢失的值

时间:2012-06-07 08:01:44

标签: wcf-ria-services silverlight-5.0

我正在使用WCF制作Silverlight应用。我想从远程服务器获取硬盘的状态,我可以使用Management对象在服务器端执行此操作。我已经定义了一个包装类来保存硬盘的数据并将对象存储在我返回的列表中。

早些时候,当包装类在服务器项目中时,它工作正常。但是,当我将类转移到同一解决方案中的类库项目时,客户端上的异步调用完成事件处理程序现在给我一个空的事件参数,即一个空列表

我尝试调试服务器和客户端代码,我看到服务器正确创建列表并很好地访问磁盘对象。但客户端代码只显示大小为0的列表。

我的客户代码是:

 private void getDiskStatus()
    {
        diskSpaceStatus.Text = "Running...";            

        if (server == string.Empty)
        {
            server = "localhost";
        }
        diskServer.Text = server;

        LogReaderClient proxy = new LogReaderClient();

        proxy.getDiskSpaceCompleted += new EventHandler<getDiskSpaceCompletedEventArgs>(proxy_getDiskSpaceCompleted);
        proxy.getDiskSpaceAsync(server);
    }



    void proxy_getDiskSpaceCompleted(object sender, getDiskSpaceCompletedEventArgs e)
    {
        diskSpaceStatus.Text = "Completed";

        try
        {
            List<uDisk> udisks = new List<uDisk>();

            foreach (Disk d in e.Result)
            {                    
                uDisk ud = new uDisk(d);
                udisks.Add(ud);
            }

            diskTable.ItemsSource = udisks;     


        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

其中uDisk是客户端的另一个包装类。

我的服务器代码是:

[OperationContract]
    public List<Disk> getDiskSpace(string server)
    {                        
        ConnectionOptions conn = new ConnectionOptions();

        ManagementScope scope = new ManagementScope("\\\\" + server + "\\root\\cimv2", conn);
        try
        {                
            scope.Connect();
        }
        catch (Exception ex)
        {
            error = ex.Message;
        }         

        ObjectQuery oq = new ObjectQuery("select FreeSpace, Size, Name from Win32_LogicalDisk where DriveType=3");
        ManagementObjectSearcher search = new ManagementObjectSearcher(scope, oq);
        ManagementObjectCollection moc = search.Get();

        List<Disk> disks = new List<Disk>();

        Disk d;
        foreach (ManagementObject mo in moc)
        {
            d = new Disk(mo);                
            disks.Add(d);
        }


        return disks;   
    }

服务器包装类是:

namespace LogFilter.DataObjects
{
    [DataContract]
    public class Disk
    {
        [DataMember]
        public string name;
        [DataMember]
        public double freeSpace;
        [DataMember]
        public double size;
        [DataMember]
        public double percentFree;

        public Disk()
        {}

        public Disk(ManagementObject mo)
        {
            this.name = Convert.ToString(mo["Name"]);
            this.freeSpace = Convert.ToDouble(mo["FreeSpace"]);
            this.size = Convert.ToDouble(mo["Size"]);
            this.percentFree = freeSpace * 100 / size;

        }
    }
}

包装器类位于命名空间LogFilter.DataObjects中,服务器代码位于命名空间LogFilter.Web中。

有人可以为此提供解决方案吗?

也有人可以给我一个关于如何将Silverlight应用程序中的transfermode设置为Buffered的资源吗?

0 个答案:

没有答案