Итак, в вашем коде есть две проблемы ...
1. Проблема лямбда-выражения
Следующая строка вызывает проблему лямбда-выражения
request.AddFile("file", s => StreamUtils.CopyStream(fileStream, s), filename);
// This is the function you want to call
void CopyStream(Stream source, Stream target)
Итак, проблема в том, что
s => StreamUtils.CopyStream(fileStream, s)
является лямбда-выражением, где Вы определяете s и задаете s в качестве второго параметра для
CopyStream(Stream source, Stream target)
, но s не относится к типу Stream. Вот почему вы получаете исключение.
2. request.AddFile нужны параметры
Предполагая, что вы используете пакет RestSharp NuGet для вашего запроса REST (я предполагаю, что, поскольку классы похожи на один раз из RestSharp), вы должны взглянуть на различные перегрузки RestRequest .AddFile ():
AddFile(string name, string path, string contentType = null);
AddFile(string name, byte[] bytes, string fileName, string contentType = null);
AddFile(string name, Action<Stream> writer, string fileName, long contentLength, string contentType = null);
Для всех функций требуется несколько параметров. Я предполагаю, что вы хотите использовать второе определение, которое
AddFile(string name, byte[] bytes, string fileName, string contentType = null);
Так что, если мы сравним его со строкой в вашем коде
request.AddFile("file", s => StreamUtils.CopyStream(fileStream, s), filename);
Мы увидим, что вы задаете следующие параметры:
- "file" как имя
- Вызов функции (лямбда-выражение) для байтов
- Переменная имени файла для имени файла
Первый и третий параметр выглядит хорошо, но второй параметр является проблемой.
Мои предложения:
Определите параметр потока звука в UploadModel и передайте его функции CopyStream:
public void UploadModel(string ProjectId, string filename, Stream sourceStream, Stream targetStream)
{
// .... your code still here, just want to show the changing lines
request.AddFile("file", StreamUtils.CopyStream(sourceStream, targetStream), filename);
}
И если вы все еще хотите вызвать StreamUtils.CopyStream (), чтобы получить второй параметр для request.AddFile, вы должны изменить определение функции, так как она в настоящее время возвращает void. Поэтому вместо:
public static void CopyStream(Stream source, Stream target)
public static void CopyStream(Stream source, Stream target, byte[] buffer)
вы должны изменить его на
public static byte[] CopyStream(Stream source, Stream target)
public static byte[] CopyStream(Stream source, Stream target, byte[] buffer)
, что приведет нас к изменениям в самом теле функции, поскольку теперь мы должны возвращать байт [] в соответствии с определением функций (это всего лишь пример, и мне все еще нужно получить реальную реализацию, которую я сейчас не могу сделать, просто надеюсь, что это даст вам представление, как это сделать):
public static byte[] CopyStream(Stream source, Stream target, byte[] buffer)
{
// -> Define a byte array
byte[] bytesToReturn;
// -> Fill the array with data
// ...
// -> return the array
return bytesToReturn;
}
С этими изменениями должно работать.