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 に設定する方法に関するリソースを教えてください。