【发布时间】:2015-12-28 20:38:18
【问题描述】:
我正在使用 RestSharp(Visual Studio 2013 中的版本 105.2.3.0,.net 4.5)来调用 NodeJS 托管的 Web 服务。我需要拨打的电话之一是上传文件。使用 RESTSharp 请求,如果我将流从我的一端检索到一个字节数组并将其传递给 AddFile,它就可以正常工作。但是,我更愿意流式传输内容,而不是将整个文件加载到服务器内存中(文件可以是 100 MB)。
如果我设置了一个操作来复制我的流(见下文),我会在 System.Net.ProtocolViolationException 的“MyStream.CopyTo”行出现异常(要写入流的字节超过 Content-Length 字节指定的大小)。在调用 client.Execute 后,此异常会在 Action 块内引发。
根据我的阅读,我不应该手动添加 Content-Length 标头,如果我这样做也无济于事。我尝试将 CopyTo 缓冲区设置得太小和太大,以及完全忽略它,但无济于事。有人可以告诉我我错过了什么吗?
// Snippet...
protected T PostFile<T>(string Resource, string FieldName, string FileName,
string ContentType, Stream MyStream,
IEnumerable<Parameter> Parameters = null) where T : new()
{
RestRequest request = new RestRequest(Resource);
request.Method = Method.POST;
if (Parameters != null)
{
// Note: parameters are all UrlSegment values
request.Parameters.AddRange(Parameters);
}
// _url, _username and _password are defined configuration variables
RestClient client = new RestClient(_url);
if (!string.IsNullOrEmpty(_username))
{
client.Authenticator = new HttpBasicAuthenticator(_username, _password);
}
/*
// Does not work, throws System.Net.ProtocolViolationException,
// Bytes to be written to the stream exceed the
// Content-Length bytes size specified.
request.AddFile(FieldName, (s) =>
{
MyStream.CopyTo(s);
MyStream.Flush();
}, FileName, ContentType);
*/
// This works, but has to load the whole file in memory
byte[] data = new byte[MyStream.Length];
MyStream.Read(data, 0, (int) MyStream.Length);
request.AddFile(FieldName, data, FileName, ContentType);
var response = client.Execute<T>(request);
// check response and continue...
}
【问题讨论】:
-
我刚刚发现了同样的问题。我的线
request.AddFile("file", stream => data.CopyTo(stream), fileName)被 RestSharp 版本 105.2.0+ 破坏了。降级到 105.1.0 时它工作正常。还没来得及调查 git-repo 中的变化... -
我也有这个问题。降级到 105.1.0 有所帮助,但我还对旧的 issue on github 添加了评论
-
你可以使用 AddFileBytes 是某种包装器
标签: c# upload streaming restsharp