まず第一に、私は問題をできるだけ単純にして、wcf でストリーム オブジェクトを転送するとき、メソッド 'Read' は私が彼に与えたパラメータを気にしないことを簡単に説明します。
WCF クライアントとサービス、TransferMode = Streamed が両側にあります。basicHttpBinding. クライアントはサービスに Stream オブジェクトを送信し、サービスはストリームを読み取り、作成した新しいファイルに書き込みます。クライアントは、私が作成したストリームのサブクラスを送信します: FileStreamを継承するFileStreamExです。
サービスが「Read」メソッドを呼び出すたびに監視できるように、このクラスをその名前空間に配置しました。
namespace ConsoleApplication1
{
/// <summary>
/// The only thing I gain from this class is to know how much was read after every time I call "Read" method
/// </summary>
public class FileStreamEx : FileStream
{
/// <summary>
/// how much was read until now
/// </summary>
public long _ReadUntilNow { get; private set; }
public FileStreamEx(string path, FileMode mode, FileAccess access, FileShare share)
: base(path, mode, access, share)
{
this._ReadUntilNow = 0;
}
public override int Read(byte[] array, int offset, int count)
{
int ReturnV = base.Read(array, offset, count);
_ReadUntilNow += ReturnV;
Console.WriteLine("Read: " + _ReadUntilNow);//Show how much was read until now
return ReturnV;
}
}
public class Program
{
static void Main(string[] args)
{
ServiceReference1.IJob Service1 = new ServiceReference1.JobClient();
string FileName = "Chat.rar";
string Path = @"C:\Uploadfiles\";
FileStreamEx TheStream = new FileStreamEx(Path + FileName, FileMode.Open, FileAccess.Read, FileShare.None);
Service1.UselessMethod1(TheStream);
}
}
}
これまでのところ、複雑なことは何もありません。以下は UselessMethod1 メソッド コードです。しかし、その前に、問題はすでに始まっています: Service1.UselessMethod1(TheStream) を呼び出した後、UselessMethod1 メソッドに行く代わりに、ファイルのサイズと出力が (クライアント側のみ):
読む: 256
読み取り: 4352
読み取り: 69888
そして、'Read' メソッドが 3 回呼び出された後にのみ、 UselessMethod1 Begin . 以下のコードを見ると、My buffer arr size が Read ごとに 1024 しかないことがわかります! 論理的には、MyStream.Read(buffer, 0, bufferSize)) の後、私の「読み取り」メソッドを開始する必要がありますが、そうではなく、「読み取り」メソッドがランダムに開始されます(または理解できない)。 「Read」メソッドの開始、「Read」メソッドが持つパラメータ「byte[] array」の Arr の長さは、呼び出されたときに 1024 になることはありません。
public void UselessMethod1(Stream MyStream)
{
using (FileStream fs = new FileStream(@"C:\Upload\"+"Chat.rar", FileMode.Create))
{
int bufferSize = 1024 ;
byte[] buffer = new byte[bufferSize];
int totalBytes = 0;
int bytes = 0;
while ((bytes = MyStream.Read(buffer, 0, bufferSize)) > 0)
{
fs.Write(buffer, 0, bytes);
fs.Flush();
totalBytes += bytes;
}
}
}
このコードの出力の一部は次のとおりです 。
しかし、私の論理では、このコードの出力は最初から必要です。
読み取り: 1024
読み取り: 1024
読み取り: 1024
読み取り: 1024
読み取り: 1024
読み取り: 1024
...
..
.
しかし、アウトアウトではありません!私の間違いはどこですか?ミスケートさえありますか?