我们正在利用Bonobo Git Server来托管一些内部git repos。在尝试检出我们的某个存储库时,我们收到了此错误:
RPC失败;结果= 22,HTTP代码= 500
致命:远程端意外挂断
在Windows事件查看器中,它会记录以下消息:
Exception information:
Exception type: ArithmeticException
Exception message: Overflow or underflow in the arithmetic operation.
Request information:
Request URL: http://localhost:50287/MyRepo.git/git-upload-pack
Request path: /MyRepo.git/git-upload-pack
如果我在本地调试Bonobo,则不会在C#中抛出异常;它来自git进程的外流。代码使用Process
来运行git.exe
,如下所示:
using (var process = System.Diagnostics.Process.Start(info))
{
inStream.CopyTo(process.StandardInput.BaseStream);
process.StandardInput.Write('\0');
process.StandardOutput.BaseStream.CopyTo(outStream);
process.WaitForExit();
}
传递给git的命令参数是:
upload-pack --stateless-rpc D:\ PathToRepos \ MyRepo
如果我在命令提示符下使用clone命令运行git.exe
,项目将正确克隆(警告为templates not found
)
我认为这是C#与git流向Response.OutputStream
之间的数据类型问题。
答案 0 :(得分:2)
问题是由于缓冲输出的响应。它会尝试在发送之前将整个流缓冲在内存中,并且使用大型存储库会导致ArithmeticException
。由于Response.Buffer
默认为true
,因此必须在发送数据之前将其明确设置为false
。显然,数据也必须以块的形式读取和流式传输。
Response.Buffer = false;
while ((read = process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
Response.OutputStream.Write(buffer, 0, read);
Response.OutputStream.Flush();
}