0

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

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

我尝试调试服务器和客户端代码,我看到服务器正确地创建了列表并很好地访问了磁盘对象。但是客户端代码只是将列表显示为大小为 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 应用程序中的传输模式设置为缓冲的资源吗?

4

0 回答 0