我有以下代码:
MemoryStream foo(){
MemoryStream ms = new MemoryStream();
// write stuff to ms
return ms;
}
void bar(){
MemoryStream ms2 = foo();
// do stuff with ms2
return;
}
Run Code Online (Sandbox Code Playgroud)
我分配的MemoryStream是否有可能以后不能被处理掉?
我有一个同行评审坚持我手动关闭它,我找不到信息来判断他是否有一个有效点.
在using语句中使用内存流时,是否需要调用close?例如这里需要ms.Close()吗?
using (MemoryStream ms = new MemoryStream(byteArray))
{
// stuff
ms.Close();
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
const int bufferSize = 1024 * 1024;
var buffer = new byte[bufferSize];
for (int i = 0; i < 10; i++)
{
const int writesCount = 400;
using (var stream = new MemoryStream(writesCount * bufferSize))
{
for (int j = 0; j < writesCount; j++)
{
stream.Write(buffer, 0, buffer.Length);
}
stream.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
我在32位机器上运行.
第一次迭代完成就好了,然后下一个迭代我收到了System.OutOfMemoryException关于该行例外newS中MemoryStream.
MemoryStream尽管有using声明,为什么以前的记忆没有被收回?我如何强制释放所使用的内存MemoryStream?
我有一个相当重要的标准.net MVC 4 Web API应用程序.
public class LogsController : ApiController
{
public HttpResponseMessage PostLog(List<LogDto> logs)
{
if (logs != null && logs.Any())
{
var goodLogs = new List<Log>();
var badLogs = new List<LogBad>();
foreach (var logDto in logs)
{
if (logDto.IsValid())
{
goodLogs.Add(logDto.ToLog());
}
else
{
badLogs.Add(logDto.ToLogBad());
}
}
if (goodLogs.Any())
{
_logsRepo.Save(goodLogs);
}
if(badLogs.Any())
{
_logsBadRepo.Save(badLogs);
}
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,我有能够发送他们的日志的设备,它运作良好.但是现在我们开始担心要传输的数据的大小,我们想看一下接受使用GZIP压缩的帖子?
我该怎么做呢?是在IIS中设置还是我可以使用Action Filters?
编辑1
跟着菲利普的回答,我的想法是我需要在它到达我的控制器之前拦截请求的处理.如果我可以在Web api框架尝试将请求的主体解析到我的业务对象之前捕获请求,该请求失败,因为请求的主体仍然被压缩.然后我可以解压缩请求的主体,然后将请求传递回处理链,希望Web Api框架能够将(解压缩的)主体解析为我的业务对象.
它看起来像使用DelagatingHandler是要走的路.它允许我在处理期间,但在我的控制器之前访问请求.所以我尝试了下面这个?
public class gZipHandler : DelegatingHandler
{
protected override …Run Code Online (Sandbox Code Playgroud) 我有这个有效的代码:
public async Task<IActionResult> OnGet()
{
var workbook = GenerateClosedXMLWorkbook();
MemoryStream memoryStream = new MemoryStream();
workbook.SaveAs(memoryStream);
memoryStream.Position = 0;
return File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "hello.xlsx");
}
private XLWorkbook GenerateClosedXMLWorkbook()
{
var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
worksheet.Cell("A2").FormulaA1 = "=MID(A1, 7, 5)";
return workbook;
}
Run Code Online (Sandbox Code Playgroud)
但是,在我看来,我需要以某种方式关闭或处理 memoryStream。那是对的吗?还是会自动关闭?