2

我们正在使用 Bonobo Git Server 来托管一些内部 git 存储库。尝试检查我们的一个存储库时,我们收到此错误:

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进程的外部。代码utlizes像这样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 的命令参数是:

上传包 --stateless-rpc D:\PathToRepos\MyRepo

如果我在git.exe命令提示符下使用 clone 命令运行,项目会正确克隆(带有 警告templates not found

我认为这是 C# 和 git 流式传输到Response.OutputStream.

4

1 回答 1

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();
}
于 2014-01-17T21:57:06.037 回答