首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地通过rest服务传递流以检索其长度

问如何正确地通过rest服务传递流以检索其长度
EN

Stack Overflow用户
提问于 2013-04-11 04:25:41
回答 1查看 6.2K关注 0票数 1

我正从这条小溪经过:

代码语言:javascript
复制
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));
}  

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

代码语言:javascript
复制
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();
    }
}  

然后在服务器上处理它:

代码语言:javascript
复制
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。我知道这是因为溪流关闭了。但我怎么能重新打开它呢?或者,当我将流传递给服务时,我应该如何做才能得到它的长度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 04:44:41

为什么不传递内容长度的标题呢?您的服务器可以检查标题,并确切地知道要发送的内容有多少字节。如何读取标题取决于您所使用的http框架、ASP.NET Web、经典的WCF、HttpListener等等。

代码语言:javascript
复制
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.ContentLength = new FileInfo(openFileDialog1.FileName).Length

如果没有内容长度标头,http服务器就永远不可能知道要读取的字节数。它所知道的是有一个流,并将阅读它,直到没有更多的数据。这也是浏览器在下载某些内容时可以显示进度条的方式。它需要bytesDownloaded /内容长度。

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

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

代码语言:javascript
复制
long dataLength = long.Parse(HttpContext.Current.Request.Headers["Content-Length"]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15940764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档