gpt4 book ai didi

c# - WCF REST、流式上传文件和 httpRuntime maxRequestLength 属性

转载 作者:IT王子 更新时间:2023-10-29 04:49:51 28 4
gpt4 key购买 nike

我已经创建了一个简单的 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);
}
}
}

它使用 webHttpBindingtransferMode 设置为“Streamed”,maxReceivedMessageSizemaxBufferPoolSizemaxBufferSize 全部设置为 2GB。 httpRuntimemaxRequestLength 设置为 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 错误的影响:

http://blogs.microsoft.co.il/blogs/idof/archive/2012/01/17/what-s-new-in-wcf-4-5-improved-streaming-in-iis-hosting.aspx

基本上,对于流式请求,IIS 中的 ASP.NET 处理程序将在将控制权移交给 WCF 之前缓冲整个请求。并且此处理程序遵守 maxRequestLength 限制。

据我所知,该错误没有解决方法,您有以下选择:

  • 升级到 .NET 4.5
  • 自行托管您的服务,而不是使用 IIS
  • 使用不基于 HTTP 的绑定(bind),以便不涉及 ASP.NET 处理程序

关于c# - WCF REST、流式上传文件和 httpRuntime maxRequestLength 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339078/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com