使用 ssl 和客户端证书上传大文件 (uploadReadAheadSize) 但不希望预读所有数据

2023-12-28

我尝试搜索互联网/堆栈溢出,但找不到任何适合我的相关答案。

我有一个 asp.net web api2 应用程序(仅使用 ssl)。 我试图允许大文件上传(最多 ~36mb),但除非我将 uploadReadAheadSize 更改为预读此大小,否则我会从 IIS 收到错误,指出请求太长。

我不想设置该属性,因为只有在 IIS 读取完所有数据后,我的数据流才会到达。

我的问题是:如何使用 ASP.NET 托管并使用 ssl(!) 和 Web api 2 进行大文件上传,而无需配置大的 uploadreadaheadsize?因为我采取的所有步骤似乎都不够。

上传预读大小:

指定 Web 服务器将读入缓冲区并传递给 ISAPI 扩展或模块的字节数。每个客户端请求都会发生一次。 ISAPI 扩展或模块直接从客户端接收任何附加数据。该值必须介于 0 和 2147483647 之间。 默认值为 49152。

这是如果我不设置 uploadReadAheadSize 并尝试通过 ssl 上传大文件时收到的错误:

HTTP 错误 413.0 - 请求实体太大

您可以尝试的事情: 由于请求实体太大,页面未显示。

最可能的原因:

由于请求实体太大,Web 服务器拒绝为该请求提供服务。 Web 服务器无法为该请求提供服务,因为它正在尝试协商客户端证书,但请求实体太大。 请求 URL 或到 URL 的物理映射(即 URL 内容的物理文件系统路径)太长。 您可以尝试的事情: 验证请求是否有效。 如果使用客户端证书,请尝试:

增加 system.webServer/serverRuntime@uploadReadAheadSize

配置您的 SSL 端点以在初始 SSL 握手过程中协商客户端证书。 (netsh http 添加 sslcert ... clientcertnegotiation=启用)

Verify that the request is valid.
  If using client certificates, try:
    Increasing system.webServer/serverRuntime@uploadReadAheadSize
    Configure your SSL endpoint to negotiate client certificates as part of the initial SSL handshake. (netsh http add sslcert ... clientcertnegotiation=enable)

如果我将预读配置为我想要允许的大小,iis 会允许我的请求:

C:\Windows\SysWOW64>C:\Windows\System32\inetsrv\appcmd set config ... -section:system.webServer/serverRuntime /uploadReadAheadSize:n /commit:apphost
Applied configuration changes to section "system.webServer/serverRuntime" for "MACHINE/WEBROOT/APPHOST/..." at configuration commit path "MACHINE/WEBROOT/APPHOST"

我在 web.config 中进行了配置:

...
<httpRuntime targetFramework="4.5.1" maxRequestLength="36864"  /> 
...

and

...
<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="37748736"> 
...

我有一个接收文件的虚拟控制器

[ControllerBufferlessAttribute()]
public class UploadController : ApiController
{
    public HttpResponseMessage Post([FromUri]string filename)
    {
        var selector = RequestContext.Configuration.Services.GetHostBufferPolicySelector();
            var isbufferless = string.Format("It is {0} that i'm bufferless but still IIS already read all the data before this context because of the readahead", selector is PolicySelectorBufferless);
            return new HttpResponseMessage(HttpStatusCode.InternalServerError) { ReasonPhrase = isbufferless };          
    }
}

属性和策略:

public class ControllerBufferlessAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings settings,
        HttpControllerDescriptor descriptor)
    {
        settings.Services.Replace(typeof(IHostBufferPolicySelector), new PolicySelectorBufferless());
    }
}
public class PolicySelectorBufferless : WebHostBufferPolicySelector
{
    public override bool UseBufferedInputStream(object hostContext)
    {
        return false;
    }
    public override bool UseBufferedOutputStream(HttpResponseMessage response)
    {
        return base.UseBufferedOutputStream(response);
    }
}

我在请求中得到的内容

确实,我是无缓冲的,但由于预读,IIS 仍然已经读取了此上下文之前的所有数据


为了使用 requestLimits 功能,您需要在 IIS 上设置 http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits#003水平第一。

也许您一开始就忘记在 IIS 服务器上安装请求过滤。

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ssl 和客户端证书上传大文件 (uploadReadAheadSize) 但不希望预读所有数据 的相关文章

  • Kendo 刷新 (DropDownList.refresh()) 不起作用错误未定义

    我试图在另一个 DropDownList 更改后刷新下拉列表 但 Refresh 方法未定义错误正在升级 我尝试再次读取数据源 它显示它正在加载 但数据仍然相同 帮助解决这个问题请 Code DropDownList1 change fun
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 为什么smtpclient发送的邮件没有出现在已发送项目中

    我已经实现了一个通过 Net SmtpClient 发送电子邮件的服务器 邮件发送代码如下 private static MailMessage SendMail string to string subject string body M
  • 使用 system.reflection 列出类字段

    我需要获取一个列表来存储类中的所有字段 值 这个班级只是一些公共的const string我在下面粘贴的变量 public class HTDB Cols public class TblCustomers public const str
  • 如何使用 WebAPI 处理图像

    问题 将图像发布 获取到我的服务有哪些不同的方法 我想我可以在 JSON 中使用 Base 64 文本 也可以保持原生二进制形式 我的理解是 通过将图像转换为文本 包大小会显着增加 如果我发送图像 从 Web 表单 从本机客户端 从另一个服
  • 如何更改 .NET MAUI Blazor 项目中的默认字体?

    我有一个用于 NET MAUI Blazor 应用程序的默认 Visual Studio 项目 针对 Windows x64 构建 我尝试了两种不同的更改字体的方法 在MauiProgram cs中有一个字体的配置ConfigureFont
  • 如何在日历中选择多个日期并将其显示在标签中

    假设我有日历 并且我想选择多个日期并在标签中显示 我使用了以下代码 但它无法正常工作 请更正 lblMultipleDate Text Calendar1 SelectedDates 0 ToShortDateString Label2 T
  • 从 BitmapImage 获取支持的图像格式

    如何获取 System Windows Media Imaging BitmapImage 支持的图像格式列表 我正在用 C WPF 编写一个简单的图像处理工具 BitmapImage 类是更有用的位图类之一 因为它能够从多种格式进行解码
  • .NET ServiceModel.Syndicate - 更改 RSS 源的编码

    我正在尝试解决我在以下位置生成的所有 RSS 源的错误http captainobvio us http captainobvio us在 Internet Explorer 版本 8 和 9 中产生以下错误 进给代码错误 从当前切换 编码
  • 在 .NET 4 下运行的 .NET 2 和 .NET 4 程序集有什么区别

    我维护一个 NET 2 0 库 最近它的用户开始要求 NET 4 版本 我可以在 Visual Studio 中复制现有项目 设置Target Framework to NET Framework 4 0并完成它 但是在 NET 4 下运行
  • 在 Visual Studio 2010 解决方案级别定位 .NET Framework 的特定版本

    我想在我的 Visual Studio 2010 解决方案中同时针对 NET 3 5 和 NET 4 0 我知道我可以设置
  • ASP.NET MVC - 更新生产中的预编译 Razor View 文件

    我想知道以下是否可能 通过在 Visual Studio 中打开项目设置 使用我们的 MVC 应用程序预编译 Razor 视图 将应用程序部署到生产环境 然后在稍后阶段 通过覆盖生产中现有的 cshtml 文件来更新视图 而无需回收应用程序
  • 添加到 .NET 任务栏中的右键单击应用程序菜单

    大多数应用程序只有 恢复 移动 调整大小 最小化 最大化和关闭 但是MS SQL提供了额外的选项 帮助 自定义视图 按照这些思路 是否可以添加到任务栏中应用程序的右键单击菜单 注 我是not指通知区域中时钟旁边的图标 这是一个更简单的ans
  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • MVC4 - ContextDependentView - 是什么意思?

    我刚刚开始使用 MVC4 我看到的第一个操作方法有一些新内容 我查了一下互联网 找不到任何关于此的信息 public ActionResult LogOn return ContextDependentView 有谁知道 ContextDe
  • 检查 SSRS 报告自定义代码中的 Active Directory 组成员资格表单

    我正在构建 SQL Server Reporting Services SSRS 报告 查看报告的最终用户可以选择某些输入参数 在本例中为位置 用户可以选择的位置取决于 Active Directory 组成员身份 因此我尝试在自定义报告功
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • 保护 ASP.NET MVC 应用程序中的 ajax 调用的安全

    我有一个基于 ASP NET MVC 的应用程序 它允许根据用户进行不同级别的访问 当前的工作方式是 当用户访问页面时 会根据数据库进行检查以确定用户拥有的权限 然后根据用户拥有的访问级别选择视图 有些用户比其他用户看到更多数据并拥有更多可

随机推荐