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 アプリケーションで転送モードを Buffered に設定する方法に関するリソースを教えてください。

4

0 に答える 0