- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已经创建了一个简单的 WCF 服务来原型(prototype)化文件上传。服务:
[ServiceContract]
public class Service1
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/Upload")]
public void Upload(Stream stream)
{
using (FileStream targetStream = new FileStream(@"C:\Test\output.txt", FileMode.Create, FileAccess.Write))
{
stream.CopyTo(targetStream);
}
}
}
它使用 webHttpBinding
,transferMode
设置为“Streamed”,maxReceivedMessageSize
、maxBufferPoolSize
和 maxBufferSize
全部设置为 2GB。 httpRuntime
将 maxRequestLength
设置为 10MB。
客户端通过以下方式发出HTTP请求:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(@"http://.../Service1.svc/Upload");
request.Method = "POST";
request.SendChunked = true;
request.AllowWriteStreamBuffering = false;
request.ContentType = MediaTypeNames.Application.Octet;
using (FileStream inputStream = new FileStream(@"C:\input.txt", FileMode.Open, FileAccess.Read))
{
using (Stream outputStream = request.GetRequestStream())
{
inputStream.CopyTo(outputStream);
}
}
现在,终于,出了什么问题:
上传 100MB 大文件时,服务器返回 HTTP 400(错误请求)。我已尝试启用 WCF 跟踪,但未显示任何错误。当我将 httpRuntime
.maxRequestLength
增加到 1GB 时,文件上传没有问题。 MSDN says maxRequestLength
“指定输入流缓冲阈值的限制,以 KB 为单位”。
这让我相信整个文件(全部 100MB)首先存储在“输入流缓冲区”中,然后才可用于我在服务器上的 Upload
方法。我实际上可以看到服务器上的文件大小并没有逐渐增加(如我所料),相反,在创建文件的那一刻,它已经有 100MB 大了。
问题:我怎样才能让它工作,以便“输入流缓冲区”相当小(比如 1MB)并且当它溢出时,我的上传
方法被调用?换句话说,我希望上传真正流式传输,而不必在任何地方缓冲整个文件。
编辑:我现在发现 httpRuntime
包含另一个与此处相关的设置 - requestLengthDiskThreshold
。似乎当输入缓冲区增长超过此阈值时,它不再存储在内存中,而是存储在文件系统中。所以至少整个100MB的大文件都没有保存在内存中(这是我最害怕的),但是,我仍然想知道是否有一些方法可以完全避免这个缓冲区。
最佳答案
如果您使用 .NET 4 并在 IIS7+ 中托管您的服务,您可能会受到以下博客文章中描述的 ASP.NET 错误的影响:
基本上,对于流式请求,IIS 中的 ASP.NET 处理程序将在将控制权移交给 WCF 之前缓冲整个请求。并且此处理程序遵守 maxRequestLength
限制。
据我所知,该错误没有解决方法,您有以下选择:
关于c# - WCF REST、流式上传文件和 httpRuntime maxRequestLength 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339078/
我们可以为 HttpRuntime 缓存中的项目设置的最长过期时间是多少...? 另外,默认的过期时间是多少? public static void Add(string pName, object
我计划创建一个 Sharepoint 计时器作业并将其配置为在我们所有的农场 Web 前端计算机上运行。 计时器作业将从 SP SQL Server 实例读取数据,并希望将其更新到我们拥有的 2 个
虽然我已经指定了一个唯一的键,但似乎以下代码将为 5 个请求返回一个值,然后为接下来的几个请求返回另一个值,然后恢复到原始请求中保存的值并继续,直到有 10 个请求不同的对象都存储在同一个 key 下
我有一个简单明了的问题。我正在处理的网络应用程序正在使用单元测试(接近 1500 个测试)。由于需要对应用程序进行修改,因此多项测试失败,因为 HttpRuntime.BinDirectory 没有值
谁能告诉我这段代码在做什么: PropertyInfo p = typeof(HttpRuntime).GetProperty("FileChangesMonitor",
我有一个线程在我的 ASP.Net 后面运行。在这个线程中,我将数据放入缓存中,如下所示: HttpRuntime.Cache.Insert("test", "test", null, DateTim
我正在尝试从 HTTPRuntime 缓存中保存和检索图像,但出现异常。我能够将流保存到缓存中,但是当我尝试检索它时,出现异常: the request was aborted. The connec
是否可以从另一个应用程序检索 HttpRuntime.Cache? 我有两个应用程序, 例如应用-A、应用-B 在 App-A 中,我正在向缓存中插入值 HttpRuntime.Cache.Inser
在我的工作地点,我们有一个 ASP.NET 页面,它使用以下代码来执行文件下载。我们使用它而不是 Request.TransmitFile(),因为该文件直接来自 zip 存档。 privat
我有一个控制台应用程序需要在我的 API 应用程序中动态加载所有端点并获取缓存数据的详细信息。 foreach (var routeTemplate in listRouteTempplate
我对以下代码有疑问。我有以下代码, if (HttpRuntime.Cache[cacheKey] == null) {
我们在 ASP.NET 中使用 HttpRuntime.Cache API 来缓存从数据库检索的数据。 对于这个特定的应用程序,我们的数据库查询具有很多参数,因此我们的缓存键看起来像这样: table
我正在尝试实现具有缓存功能的 Web 应用程序。我需要缓存的原因是我们有一个应用程序可以让用户访问在线类(class)。现在,一旦用户登录,我就会根据我们的数据库验证他。验证后,我想将用户 ID 和类
与使用简单静态字段相比,使用 HttpRuntime 缓存的主要优点和缺点是什么? 我需要在整个 ASP.NET 应用程序的范围内存储数据。 HttpRuntime.Cache["MyData"] =
过去,我对访问 HttpRuntime.Cache 机制设置了锁定。我不确定我过去是否真的研究过这个问题并盲目地用一把锁把它包围起来。 您认为这真的有必要吗? 最佳答案 这篇文章建议应该使用锁: ht
我知道大多数人推荐使用 HttpRuntime.Cache,因为它具有更大的灵 active ……等等。但是如果您希望对象在应用程序的整个生命周期内持久保存在缓存中怎么办?使用 Application
我一直在使用 HttpRuntime 缓存在一个内部 [dasboard] asp.net 应用程序上缓存简单的用户首选项,该应用程序每天被近 200 名用户使用。 我只是缓存诸如上次查询条件、比例、
我正在考虑在我的 ASP.NET Web 应用程序中实现一些缓存以提高性能。我读过关于 HttpRuntime.Cache 的文章,它似乎就是为此而生的。唯一的问题是我想潜在地缓存大量数据(主要是 S
假设我有这样的东西: string TheFile = HttpRuntime.AppDomainAppPath + "\\SomeDir\\" + TheFilename + ".js"; Syst
我环顾四周,尚未找到一种在文件大小配置部分和我允许的最大值之间同步的方法。这可能吗? 在 web.config 文件中允许非常大的文件大小,然后在实现中强制使用较小的文件大小是否只是最佳实践? 最佳答
我是一名优秀的程序员,十分优秀!