1

私はこの方法でストリームを渡しています:

StreamReader sr = new StreamReader(openFileDialog1.FileName);
byte[] fileStream = Utility.ReadFully(sr.BaseStream);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
request.Method = "POST";
request.ContentType = "application/octet-stream";

Stream serverStream = request.GetRequestStream();
serverStream.Write(fileStream, 0, fileStream.Length);
serverStream.Close();

HttpWebResponse response2 = (HttpWebResponse)request.GetResponse();
if (response2.StatusCode == HttpStatusCode.OK)
{
    MessageBox.Show(Utility.ReadResponse(response2));
}  

-------------------------------------------------- -----------------------

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream())
    {
        if (input != null)
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
        }
        return ms.ToArray();
    }
}  

次に、サーバーで処理します。

public bool UploadPhotoStream(string someStringParam, Stream fileData)
{
    string filePath = string.Format("{0}/{1}", 'sdfgsdf87s7df8sd', '24asd54s4454d5f4g');

    ProductPhoto newphoto = new ProductPhoto();
    newphoto.FileSizeBytes = fileData.Length / 1024 / 1024;
    newphoto.FileLocation = filePath;

    ...
}  

今、私は をNotSupportedException呼び出すときに取得してfileData.Lengthいます。ストリームが閉じられているために発生することはわかっています。しかし、どうすれば再び開くことができますか?または、ストリームをサービスに渡すときに、その長さを取得できるようにするにはどうすればよいですか?

4

1 に答える 1

1

content-length ヘッダーを渡さないのはなぜですか? サーバーはヘッダーをチェックして、送信されているコンテンツの正確なバイト数を知ることができます。ヘッダーの読み取り方法は、使用している http フレームワーク、ASP.NET Web Api、従来の WCF Web Api、HttpListener などによって異なります。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.ContentLength = new FileInfo(openFileDialog1.FileName).Length

Content-Length ヘッダーがないと、http サーバーは、読み取りが残っているバイト数を知ることができません。それが知っているのは、ストリームが存在し、データがなくなるまでそれを読み取ることだけです。これは、何かをダウンロードするときにブラウザーがプログレス バーを表示する方法でもあります。bytesDownloaded / Content-Length かかります。

この投稿によると: https://stackoverflow.com/a/8239268/1160036

Web メソッドからこのようなヘッダーにアクセスできます。

long dataLength = long.Parse(HttpContext.Current.Request.Headers["Content-Length"]);
于 2013-04-11T04:44:41.010 に答える