【问题标题】:System.Net.ProtocolViolationException:Bytes to be written to the stream exceed the Content-Length bytes size specifiedSystem.Net.ProtocolViolationException:要写入流的字节超过指定的 Content-Length 字节大小
【发布时间】:2026-01-17 20:20:04
【问题描述】:

我基于HttpListener编写web服务器代码,但经常出现类似的异常

"System.Net.ProtocolViolationException: 要写入的字节数 流超过了指定的 Content-Length 字节大小”。

示例代码:

context.Response.Output = System.Text.Encoding.UTF8.GetBytes("xxx");
if (context.Response.Output != null && context.Response.Output.Length > 0)
{
    context.Response.ContentLength64 = context.Response.Output.Length;
    using (var stream = context.Response.OutputStream)
    {
        stream.Write(context.Response.Output, 0, context.Response.Output.Length);
    }
}

并非每次请求都发生此异常。 谁能告诉我怎么修。谢谢!

【问题讨论】:

    标签: c# outputstream httplistener


    【解决方案1】:

    您的问题似乎与以下问题相同。您需要检查 HttpMethod 是否为 HEAD 请求;在这种情况下,您无法将字节写入 OutputStream 并且尝试这样做会引发您得到的异常。

    ProtocolViolationException with Chrome

    【讨论】:

    • 但我只在 httpMethod 中使用了 GET,POST,PUT,DELETE。
    • 客户端仍然可以向您发送头部请求。您是否抓住了这一点并记录和错误并退出?如果没有,那么您需要检查在这种情况下您是否收到了 head 请求。
    • 我用 Fiddler 发送 HEAD 请求,服务器抛出 ProtocolViolationException。浏览器会自动发送 HEAD 请求吗?
    • 是的,浏览器可以向您发送 HEAD 请求,或者,根据您在哪里部署和运行它,其他东西正在向您的服务器发送 HEAD 请求。您是否为 HttpMethod 为 HEAD 时添加了日志语句?是不是中招了?好像是这样。
    最近更新 更多