- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将以下读取 HttpContent 的完整字符串响应的代码转换为字符串,以仅读取特定的最大字符数。现有代码:
private static async Task<string> GetContentStringAsync(HttpContent content)
{
string responseContent = await content.ReadAsStringAsync().ConfigureAwait(false);
return responseContent;
}
我现在的代码:
private static async Task<string> GetContentStringAsync(HttpContent content, int ResponseContentMaxLength)
{
string responseContent;
Stream responseStream = await content.ReadAsStreamAsync().ConfigureAwait(false);
using (StreamReader streamReader = new StreamReader(responseStream))
{
// responseContent = Data from streamReader until ResponseContentMaxLength
}
return responseContent;
}
我是 StreamReader 和 HttpContent 操作的新手。有没有办法做到这一点?
最佳答案
有多种方法可以做到这一点。但是,恕我直言,最简单的方法之一是创建一个 MemoryStream
,您已在其中读取了所需的确切字节数,然后从该流中读取 StreamReader
对象而不是原来的。
例如:
private static async Task<string> GetContentStringAsync(HttpContent content, int ResponseContentMaxLength)
{
string responseContent;
Stream responseStream = await content.ReadAsStreamAsync().ConfigureAwait(false);
int totalBytesRead = 0;
byte[] buffer = new byte[ResponseContentMaxLength];
while (totalBytesRead < buffer.Length)
{
int bytesRead = await responseStream
.ReadAsync(buffer, totalBytesRead, buffer.Length - totalBytesRead);
if (bytesRead == 0)
{
// end-of-stream...can't read any more
break;
}
totalBytesRead += bytesRead;
}
MemoryStream tempStream = new MemoryStream(buffer, 0, totalBytesRead);
using (StreamReader streamReader = new StreamReader(tempStream))
{
// responseContent = Data from streamReader until ResponseContentMaxLength
}
return responseContent;
}
以上当然假设 ResponseContentMaxLength
的值足够小,因此分配一个足够大的 byte[]
来临时存储那么多字节是合理的。由于返回的内容规模相当,这似乎是一个合理的假设。
但是如果您不想维护额外的缓冲区,另一种方法是编写一个 Stream
类,它只从底层流对象中读取您指定的字节数,然后将其实例(使用 ResponseContentMaxLength
值初始化)传递给 StreamReader
对象。与上述相比,这是相当多的额外工作。 (不过,我想因为这是一个非常有用的对象,可能已经有一个公开可用的实现......我知道我自己至少写过几次类似的东西,我只是碰巧手边没有代码那一刻)。
关于c# - 使用 StreamReader 读取 HttpContent 流直到字符限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31015479/
我们在代码库中看到了以下堆栈跟踪: System.ArgumentException: An item with the same key has already been added. at
我有这个代码示例,它是作为对另一个问题 (Send a file via HTTP POST with C#) 的回答而发布的。除了一个问题外,它工作正常。它用双引号将 HTTP header 中的边
我正在尝试使用 HttpContent: HttpContent myContent = HttpContent.Create(SOME_JSON); ...但是我没有运气找到它定义的 DLL。 首先
我正在研究应该完成简单事情的自定义过滤器。我所有的 API 都包装到“响应”对象中。我想使用过滤器填写所有属性。这是我的过滤器代码: public class MeteringFilter : IAc
我已经创建了一个 API,它应该能够通过 POST 和字符串形式的请求主体连接到外部 API。 我可以毫不费力地直接从 Postman 连接到 API。但是它不能通过我自己的 API 工作。 有什么想
我有一个通过 HttpSelfHostServer (ASP.Net WebApi Beta) 运行的小型 REST 服务,但在反序列化一些发布到服务器的数据时遇到了一些问题。方法签名如下: publ
我正在将 HttpContent 转换为以下 dto: public class ContentDto { public string ContentType {get; set;}
我正在使用 HttpClient.PostAsync() 并且响应是 HttpResponseMessage。它的 Content 属性是 HttpContent 类型,它有一个 CopyToAsyn
使用 Web API 2.2,假设我想从 HttpContent 中读取两次,每次都是不同的类型。 await httpContent.LoadIntoBufferAsync(); //necessa
我在网络上看到大量使用新 HttpClient 的示例对象(作为新 Web API 的一部分)应该有 HttpContent.ReadAsAsync方法。然而,MSDN没有提到这个方法,Intelli
这个问题在这里已经有了答案: POSTing JsonObject With HttpClient From Web API (10 个答案) Send HTTP POST message in A
尝试将文件添加到 http rest 调用时出现此错误: responseJson = {Message: "An error has occurred.", ExceptionMessage: "I
我正在设置一个 API 来与数据库交互,当该 API 收到一个帖子以创建一个已经存在于它的相应表中的条目时,我想返回一个带有解释性消息的代码 209 冲突。所以我尝试了这个: Controller p
我尝试创建 Windows 应用商店应用。我需要发送邮寄请求,但我遇到了问题。我的方法: private async Task POST(byte[] pic, string uploa
我正在使用 Microsoft.AspNet.WebApi.Client在我的 ASP.MVC 5 项目中使用休息服务。我正在关注 this使用 HttpClient 的教程。代码未编译,因为 Rea
我目前正在开发 C# Web API。对于特定调用,我需要使用对 API 的 ajax 调用发送 2 个图像,以便 API 可以将它们保存为数据库中的 varbinary(max)。 如何从 Http
我们正在构建一个高度并发的 Web 应用程序,最近我们开始广泛使用异步编程(使用 TPL 和 async/await)。 我们有一个分布式环境,其中应用程序通过 REST API(构建在 ASP.NE
我正在集成一个从几乎端点返回此模型的 API { meta: { ... }, data: { ... } } 但对于某些调用,数据是同类对象的数组 { meta: { ... },
在我的 Owin 自托管 Web Api 项目中,我正在尝试构建一个 custom MediaTypeFormatter继承自 BufferedMediaTypeFormatter 。但问题是Http
我正在尝试将以下读取 HttpContent 的完整字符串响应的代码转换为字符串,以仅读取特定的最大字符数。现有代码: private static async Task GetContentStri
我是一名优秀的程序员,十分优秀!