Moonwarrior Ответов: 0

Как перенести сложный объект, содержащий поток в качестве члена, со уровня сервиса web API на клиентский контроллер


Привет,
Я пытаюсь отправить объект
public class FileStreamDto
    {
        public FileStreamDto(){}}
        public string Name { get; set; }
        public Stream Data { get; set; }
    }

из сервисного слоя в моем случае Asp.net Web API2 к клиентскому контроллеру. Я могу успешно отправить потоковые данные на клиентский контроллер, но я хочу отправить сложный объект через него, чтобы я мог восстановить объект и использовать его на другом конце(клиентский конец).

Что я уже пробовал:

Я уже пробовал
DataContractJsonSerializer
чтобы сериализовать объект, но я получаю следующую ошибку.
Type 'System.Net.Http.WinHttpResponseStream' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. Alternatively, you can ensure that the type is public and has a parameterless constructor - all public members of the type will then be serialized, and no attributes will be required.


public async Task<IActionResult> Download([FromQuery]Guid fileId)
        {
            try
            {
                var downloadResponse = await _documentProxy?.GetFile(fileId);
                var type = downloadResponse.Body.GetType();
                DataContractJsonSerializer dcj = new DataContractJsonSerializer(new FileStreamDto().GetType());
                var ms = new MemoryStream();
                dcj.WriteObject(ms, downloadResponse.Body.Data);
                var response = File(ms, "application/octet-stream", downloadResponse.Body.Name);
                return response;
            }
            catch (Exception ex)
            {
                //log and send a custom error to service
                throw new Exception($"Unable to retrieve document for {fileId}");
            }
        }

F-ES Sitecore

Как говорится в ошибке, вы не можете сериализовать поток. Я предполагаю, что вы вызываете этот метод через http, поэтому все, что вы возвращаете, должно быть представлено в виде текста. Поток может содержать двоичные данные, а также быть изменчивой длины (то есть это может быть поток в сокете, который постоянно получает данные). Вероятно, вам придется преобразовать свой поток в base64 и передать его таким образом, а не как поток, а затем вызывающий код должен будет преобразовать его обратно в двоичный код.

Moonwarrior

Но не думаете ли вы, что строка кодирования Base64 сделает мои данные действительно большими по размеру при отправке по проводу по сравнению с отправкой потока

F-ES Sitecore

Да, но вы не можете сериализовать поток, поэтому у вас нет особого выбора. Возможно, вы могли бы предоставить поток самостоятельно с помощью другого вызова метода, чтобы клиент получил ваш объект, а затем загрузил поток, но это может значительно усложнить ваш код.

Moonwarrior

Да, сейчас я занимаюсь последним вариантом. Спасибо за Ваш вклад, я действительно ценю это.

0 Ответов