如何正确地通过rest服务传递流以获取其长度



我是这样传递流的:

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;
    ...
}  

现在我调用fileData.Length时得到NotSupportedException。我知道这是因为河流关闭了。但是我怎样才能重新打开它呢?或者,当我将流传递给服务时,我应该怎么做才能仍然获得它的长度?

为什么不传递content-length header呢?您的服务器可以检查报头并确切地知道正在发送的内容有多少字节。如何读取头取决于您使用的是哪个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服务器永远不会知道还有多少字节需要读取。它只知道有一个流,并将读取它,直到没有更多的数据。这也是你的浏览器在下载某些东西时显示进度条的方式。

根据这篇文章:https://stackoverflow.com/a/8239268/1160036

你可以从你的web方法中像这样访问标题。

long dataLength = long.Parse(HttpContext.Current.Request.Headers["Content-Length"]);

相关内容

  • 没有找到相关文章

最新更新