NodeJS tarafından barındırılan bir web hizmetini çağırmak için RestSharp (Visual Studio 2013, .net 4.5 sürümü 105.2.3.0) kullanıyorum. Yapmam gereken çağrılardan biri bir dosya yüklemek. Bir RESTSharp isteği kullanarak, akışımı sondan bir bayt dizisine alıp AddFile'a aktarırsam, düzgün çalışır. Bununla birlikte, içeriği daha çok akışa geçirip sunucu belleğinde tüm dosyaları yüklememeyi tercih ederim (dosyalar 100 MB olabilir).RestSharp AddFile Akışını Kullanma
Akışımı kopyalamak için bir Eylem kurduysam (aşağıya bakın), System.Net.ProtocolViolationException "MyStream.CopyTo" satırında bir istisna alıyorum (Akışa yazılacak bayt İçerik Uzunluğunu aştı) bayt boyutu belirtildi). Bu istisna, client.Execute çağrıldıktan sonra Action bloğuyla atılır.
Okuduğum kadarıyla, bir Content-Length üstbilgisini el ile eklememeliyim ve yapmam durumunda yardımcı olmaz. CopyTo arabellekini küçük ve büyük değerlere ayarlamayı denemekteyim, tamamen boş bırakmayacak kadar iyi değil, boşuna. Birisi bana neyi özlediğime dair ipucu verebilir mi?
// 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...
}
Eklemek zorundayım, aynı sorunu daha yeni keşfettim. Benim satır 'request.AddFile (" dosya ", stream => data.CopyTo (akış), dosyaAdı)' RestSharp sürüm 105.2.0+ ile kırıldı. 105.1.0'a düşürüldüğünde, iyi çalışır. Git-repo'daki değişiklikleri araştırmak için zamanım olmadı ... – anve
Bu problemi de yaşıyorum. 105.1.0'a düşürme yardımcı oldu, ancak aynı zamanda eski [github'daki sorun] 'a bir yorum ekledim (https://github.com/restsharp/RestSharp/issues/70) – Dmitry
AddFileBytes'i kullanabilirsiniz. – hpfs