代码之家  ›  专栏  ›  技术社区  ›  Mark S. Rasmussen

通过webservice接收文件的最佳方式

  •  4
  • Mark S. Rasmussen  · 技术社区  · 17 年前

    我有一个由ASP.NET Web服务组成的API,可通过GET/POST/SOAP调用。

    API需要尽可能容易地使用。我正在考虑放弃SOAP支持,因为我们的PHP客户机主要使用GET/POST方法,而.NET客户机对这两种方法都不介意。作为一个先决条件,我考虑简单地创建一个UploadFile(文件名)方法,并要求用户通过POST发送文件作为一个普通的文件上传。

    但是,我不能将文件字段指定为方法的参数,对吗?所以,如果我只是在文档中声明“文件应该在名为“file”的POST字段中发送”,那么当我需要读取文件时,这会带来任何问题吗?

    所有文件都是二进制格式、PDF格式、各种图像格式、FLV格式等。此外,文件大小将主要在2-20MB附近,但鉴于上述解决方案,我在接受250MB区域的文件时会遇到任何问题吗?

    以这种方式接收文件将导致在我将文件写入磁盘之前,文件被完全加载到内存中-除了让服务接收流,从而禁止我接受其他参数,并妨碍服务的轻松使用之外,还有其他方法吗?


    4 回复  |  直到 17 年前
        1
  •  2
  •   Will Hartung    17 年前

    使用简单的POST方法提交文件并没有什么可怕的错误,只是将文件上传绑定到任何相关元数据的细节(即,如果该方法与该方法捆绑在一起,则该方法的其他参数)。

        2
  •  2
  •   S.Lott    17 年前

    “当我需要阅读文件时,这会造成任何问题吗?”没有问题。当处理POST请求时,POST会有一个MIME附件,即文件。读取此文件相对简单。

    “我接受250MB区域的文件会有困难吗?”不会。只是传输大文件需要一些时间。

    “以这种方式接收文件将导致文件完全加载到内存中”不一定正确。许多web服务器处理请求直到MIME附件并停止读取,从而使HTTP头、请求和开放套接字可用于进一步处理。我不知道ASP,但我知道几乎所有的框架都避免读取数据。框架将此留给您的应用程序。

    波斯特正是这样做的。没有走出狭窄的HTTP web服务空间,就没有很多替代方案。当然,您可以使用其他协议,如FTP(TFTP,SFTP)来移动文件,但这对于编写客户端应用程序的人来说常常令人困惑。

    HttpWebRequest 对象和带有附件的流。但是你不会存很多钱,因为 HttpWebRequest 这个类看起来很简单。这里有一个 code sample

        3
  •  1
  •   Mark Brackett    17 年前

    但是,我不能将文件字段指定为方法的参数,对吗?所以,如果我只是在文档中声明“文件应该在名为“file”的POST字段中发送”,那么当我需要读取文件时,这会带来任何问题吗?

    没有理由不包含额外的POST(或GET)参数。我自己可能会将文件名作为额外的POST参数,以便在请求中自动使用本地文件名的客户端可以轻松重命名。如果我预料到命名冲突,我甚至可能在发生冲突时返回服务器选择的名称……我认为其他人使用某种HTTP创建的状态代码。

    所有文件都是二进制格式、PDF格式、各种图像格式、FLV格式等。此外,文件大小将主要在2-20MB附近,但鉴于上述解决方案,我在接受250MB区域的文件时会遇到任何问题吗?

    以这种方式接收文件将导致在我将文件写入磁盘之前,文件被完全加载到内存中-除了让服务接收流,从而禁止我接受其他参数,并妨碍服务的轻松使用之外,还有其他方法吗?

    ASP.NET 2.0+后台程序在文件进入时将其上载到磁盘,以避免将整个请求预加载到RAM中。调整web.config的 requestLengthDiskThreshold 适当地平衡速度和内存使用。如果您想获取流,则无法获取流…尽管您可以获取字节[]数组。我真的不知道那意味着什么。。。。

    有许多不同的ASP.NET文件上载组件,它们基本上连接起来,作为一个HttpModule启动请求,并拦截任何多部分/表单上载的请求流。对于ASP.NET2.0,这可能是不必要的,除非您想提供某种进度回调或其他什么。如果是这样的话,它们的机制应该与web服务一起工作。

    upload component 如果您打算解析自己的请求,那么就很好地展示了请求的外观。

    我想问的一个问题是,客户端http库中对多部分/表单数据的支持程度如何。我怀疑这一切都很好,但你可能想检查一下。

        4
  •  0
  •   Robert Paulson    17 年前

    BITS - Background Intelligent Transfer Service [wiki]

    它可能与您/您的客户相关,也可能与您/您的客户无关。

    推荐文章