C# - httpWebRequest 流的大小是否有限制?

2023-12-08

我正在尝试构建一个应用程序,使用 httpwebrequests 从自定义网络服务器下载一个小二进制文件(20-25 KB)。

这是服务器端代码:

Stream UpdateRequest = context.Request.InputStream;
byte[] UpdateContent = new byte[context.Request.ContentLength64];
UpdateRequest.Read(UpdateContent, 0, UpdateContent.Length);
String remoteVersion = "";
for (int i = 0;i < UpdateContent.Length;i++) { //check if update is necessary
    remoteVersion += (char)UpdateContent[i];
}

byte[] UpdateRequestResponse;

if (remoteVersion == remotePluginVersion) {
    UpdateRequestResponse = new byte[1];
    UpdateRequestResponse[0] = 0; //respond with a single byte set to 0 if no update is required
} else {
    FileInfo info = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), "remote logs", "PointAwarder.dll"));
    UpdateRequestResponse = File.ReadAllBytes(Path.Combine(Directory.GetCurrentDirectory(), "remote logs", "PointAwarder.dll"));
    //respond with the updated file otherwise
}

//this byte is past the threshold and will not be the same in the version the client recieves
Console.WriteLine("5000th byte: " + UpdateRequestResponse[5000]);

//send the response
context.Response.ContentLength64 = UpdateRequestResponse.Length;
context.Response.OutputStream.Write(UpdateRequestResponse, 0, UpdateRequestResponse.Length);
context.Response.Close();

此后,数组 UpdateRequestResponse 包含整个文件并已发送到客户端。

客户端运行此代码:

//create the request
WebRequest request = WebRequest.Create(url + "pluginUpdate");
request.Method = "POST";
//create a byte array of the current version
byte[] requestContentTemp = version.ToByteArray();
int count = 0;
for (int i = 0; i < requestContentTemp.Length; i++) {
    if (requestContentTemp[i] != 0) {
        count++;
    }
}
byte[] requestContent = new byte[count];
for (int i = 0, j = 0; i < requestContentTemp.Length; i++) {
    if (requestContentTemp[i] != 0) {
        requestContent[j] = requestContentTemp[i];
        j++;
    }
}

//send the current version
request.ContentLength = requestContent.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(requestContent, 0, requestContent.Length);
dataStream.Close();

//get and read the response
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
byte[] responseBytes = new byte[response.ContentLength];
responseStream.Read(responseBytes, 0, (int)response.ContentLength);
responseStream.Close();
response.Close();

//if the response containd a single 0 we are up-to-date, otherwise write the content of the response to file
if (responseBytes[0] != 0 || response.ContentLength > 1) {
    BinaryWriter writer = new BinaryWriter(File.Open(Path.Combine(Directory.GetCurrentDirectory(), "ServerPlugins", "PointAwarder.dll"), FileMode.Create));
    writer.BaseStream.Write(responseBytes, 0, responseBytes.Length);
    writer.Close();
    TShockAPI.Commands.HandleCommand(TSPlayer.Server, "/reload");
}

客户端上的字节数组 responseBytes 应与服务器上的数组 UpdateRequestResponse 相同,但事实并非如此。大约 4000 字节之后,每个字节都设置为 0,而不是应有的值(responseBytes[3985] 是最后一个非零字节)。

发生这种情况是因为 httpWebRequest 有大小限制吗?我在代码中看不到任何可能导致该问题的错误,并且相同的代码在其他情况下也有效,在这些情况下我只需要传递短数据序列(小于 100 字节)。

MSDN 页面没有提到任何这样的大小限制。


这并不是说它有任何人为限制,这是Streaming您尝试做的事情的性质。我有一种感觉,下面这行是罪犯:

responseStream.Read(responseBytes, 0, (int)response.ContentLength);

我过去遇到过这个问题(使用 TCP 流),它不会读取数组的所有内容,因为它们还没有全部通过网络发送。这就是我会尝试的。

for (int i = 0; i < response.ContentLength; i++)
{
   responseBytes[i] = responseStream.ReadByte();
}

这样,它将确保一直读取直到流结束。

EDIT

usr's BinaryReader基于的解决方案效率更高。以下是相关解决方案:

BinaryReader binReader = new BinaryReader(responseStream);
const int bufferSize = 4096;
byte[] responseBytes;
using (MemoryStream ms = new MemoryStream())
{
    byte[] buffer = new byte[bufferSize];
    int count;
    while ((count = binReader.Read(buffer, 0, buffer.Length)) != 0)
        ms.Write(buffer, 0, count);
    responseBytes = ms.ToArray();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# - httpWebRequest 流的大小是否有限制? 的相关文章

  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 调整屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

    在MFC中 对话框的设计使用DLUs http msdn microsoft com en us library bb847924 aspx 在 WPF 中 我们以 1 96 英寸为单位指定 虽然这确实会缩放窗口和视觉元素 但我们如何使 W
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 对 Android 库应用程序进行单元测试的最简单方法?

    抱歉 如果这是一个有点模糊的问题 但是我很难找到一个solid有关如何使用 Android 进行单元测试 隔离测试 的示例 这是我想要实现的目标的示例 Some class class Calculator public int Add i
  • 检测屏幕分辨率来加载替代 CSS 是个好主意吗?

    我与一位平面设计师合作 他一直希望制作大于我推荐的 960 像素的网站 我可以使用液体布局做一定量的工作 但我真的很喜欢能够加载不同的 CSS 以实现更大的分辨率 我用谷歌搜索并找到了下面的链接 但我担心我没有听到更多关于此的信息 这是一个
  • NSDate 一天的开始和一天的结束

    NSDate beginningOfDay NSDate date NSCalendar cal NSCalendar currentCalendar NSDateComponents components cal components N
  • 如何在android中使用Gson库解析json响应?

    我有 api 它的响应如下 0 serialize 1 login users token aaaaa message login successful 我如何使用 Gson 在 android 中解析它 创建一个 Json 的 pojo
  • 为什么 Tiles REGEXP 通配符定义会导致无尽的 jsp 包含错误

    我将tiles 2 2 2与Struts2 2 2 3一起使用 因为Struts2 Tiles插件相当旧 它的实现使用了许多Tiles已弃用的API 并且我想尝试REGEXP通配符 所以我在下面实现了我自己的监听器 我的TilesConta
  • 来自后台工作人员的文本框文本?

    我一直在试图弄清楚如何从后台工作人员中获取文本框的文本或其他属性 有人知道怎么做这个吗 我无法将其作为参数传递 因为它需要是实时的 谢谢您的帮助 我认为你只需要调用该属性 伪代码 private void bgw1 DoWork objec
  • 向订阅该主题的所有用户推送通知(使用 FCM Firebase 的登录用户除外)

    现在我有一个拥有一万多名成员的群组 并且我为一个群组创建了一个主题 通知主题 该群组中的所有用户都订阅了该主题 现在 在组内任何用户都可以添加图像 文件或视频等帖子 当用户添加帖子时 我需要向订阅该主题的所有用户发送通知 但除了一个之外 即
  • 如何检测 CMake 中的意外函数覆盖?

    我刚刚在我的 CMake 代码中发现了复制和粘贴错误 function name do something endfunction function name do something else endfunction 我已经多次复制 重命
  • SKLabelNode 将消失但仍然可点击

    我正在使用 SpriteKit 和 Swift 制作一个游戏 运行 Xcode 6 我有一个SKLabelNode 我们称之为myLabelNode对于这个例子 当我打电话时myLabelNode removeFromParent 它会像它
  • C# StreamReader 从标签输入文件?

    我一直在使用StreamReader inputFile代码来自ListBox它效果很好 但是 我想输入来自 txt文件到一个Label盒子代替 这可能吗 这是我尝试过的代码 它给了我一个错误描述 说明 Use of unassigned
  • 如何为 UIPageViewControllerDataSource 提供默认实现?

    我认为这个问题的答案通常会解决 Objective C 协议的问题 但这是我遇到的第一个问题 我希望在实施时使用这些方法UIPageViewControllerDataSourceWithConnections import UIKit p
  • 是否有*任何*情况下“for _ in [1,2,3]”根本不会循环?

    我正在编写一些代码并犯了一个错误 该错误简化为 func f gt Int for in 1 2 3 return 1 编译器向我显示一个错误 指出f缺少回报 这让我意识到我的错误 我忘记在周围放置一个 if 语句return 但后来我意识
  • python 多处理队列实现

    我无法理解如何将队列实现到下面的多处理示例中 基本上 我希望代码能够 1 产生2个进程 完成 2 将我的 id list 分成两部分 完成 3 让每个进程迭代列表 打印出每个项目 并且仅在完成列表后才关闭 我知道我必须实现某种类型的排队系统
  • 如何使用ajax从html获取数据并将数据传递到php

    您好 我很想知道如何将字符串从表单传递到 php 该 php 将测试其中是否有内容 然后使用此表单发布一条警报消息 尝试从中获取数据 然后显示它是否已通过正确 HTML 代码
  • 在 Android 中使用 NanoHTTPD

    我正在尝试使用 NanoHTTP 来提供 HTML 文件 然而 NanoHTTP 相对来说没有文档记录 而且我对 Android 还很陌生 我的问题是 我在哪里存储 html 文件 以及如何使用 NanoHTTP 提供它 答案很晚 但可能对
  • 如何从 Java 9+ 中的目录动态加载模块

    我一直在开发一个带有基于插件的系统的软件 用户可以在其中编写自己的插件 我对 JMPS 很陌生 但我想使用 JMPS 而不是 OSGi 来实现这一点 制作了一个单独的 API 模块 甚至创建了一个测试插件 插件以文件名 someplugin
  • UTC_TIMESTAMP() 是否受夏令时影响?

    我正在编写一个具有时段预订系统的应用程序 用户可以位于不同的时区 因此我需要以 UTC 时间将值存储在数据库中 我想知道如何UTC TIMESTAMP 是在MySQL中计算的 可靠吗 如果服务器时区位于夏令时地区UTC TIMESTAMP
  • Laravel 多文件上传验证

    我目前正在以一种形式工作 我在多个文件上传验证方面遇到一些问题 我的表单中只有一个字段允许上传多个文件
  • 如何在 pyplot 中的分组条形图中标记组?

    我想在 pyplot 中做类似以下的事情 我也可以在其中标记条形图和组 我能够标记条形 但不知道如何标记组 谢谢 默认的Seaborn 条形图会创造一个传说来显示岁月 import numpy as np import pandas as
  • C# - httpWebRequest 流的大小是否有限制?

    我正在尝试构建一个应用程序 使用 httpwebrequests 从自定义网络服务器下载一个小二进制文件 20 25 KB 这是服务器端代码 Stream UpdateRequest context Request InputStream