非常に単純なプログラムで問題が発生しています。まず、次のような実用的なコードから始めました。
RemoteFileInfo result = new RemoteFileInfo();
string filePath = System.IO.Path.Combine(ConfigurationManager.AppSettings["OmnitureSPDir"], request.FileName);
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
// check if exists
if (!fileInfo.Exists)
throw new System.IO.FileNotFoundException("File not found",
request.FileName);
// open stream
System.IO.FileStream stream = new System.IO.FileStream(filePath,
System.IO.FileMode.Open, System.IO.FileAccess.Read);
// return result
result.FileName = request.FileName;
result.Length = fileInfo.Length;
result.FileByteStream = stream;
return result;
これは、ファイル名を含む「request」と呼ばれるパラメーターを受け取り、ファイルが存在するかどうかを確認し、存在する場合はファイルをストリーミングします。
Visual StudioでMicrosoftコード分析を実行し、dispose()がないことに気付いた後、usingステートメントでラップすることで問題を「解決」しました。
using (RemoteFileInfo result = new RemoteFileInfo()) {
string filePath = System.IO.Path.Combine(ConfigurationManager.AppSettings["OmnitureSPDir"], request.FileName);
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
// check if exists
if (!fileInfo.Exists)
throw new System.IO.FileNotFoundException("File not found",
request.FileName);
// open stream
System.IO.FileStream stream = new System.IO.FileStream(filePath,
System.IO.FileMode.Open, System.IO.FileAccess.Read);
// return result
result.FileName = request.FileName;
result.Length = fileInfo.Length;
result.FileByteStream = stream;
return result;
}
このコードを実行した後、ファイルはストリーミングされなくなりましたが、次のエラーが発生することがわかりました。
Value cannot be null.
Parameter name: FileByteStream
Using()ステートメントを削除して問題を修正しましたが、理由がわかりません。コードを追加することで、私は良いことをしていると思いました。私が間違ったことを理解したいので、それを繰り返さず、このメソッドを適切にコーディングできます。
RemoteFileInfoの定義は次のとおりです
public class RemoteFileInfo : IDisposable
{
[MessageHeader(MustUnderstand = true)]
public string FileName;
[MessageHeader(MustUnderstand = true)]
public long Length;
[MessageBodyMember(Order = 1)]
public System.IO.Stream FileByteStream;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing && FileByteStream != null)
{
FileByteStream.Close();
FileByteStream = null;
}
}
}