Я использую C# ASP. NET веб-API с фреймворком 4.7.2 (пока нет ядра из-за устаревших причин) с swagger, и у меня есть объект CameraFrame, который я хочу иметь возможность выставлять через веб api.
Если я обычно выставляю CameraFrame, он преобразуется в json и обратно. Это ужасно медленно из-за размера массива байтов. Поэтому я хотел бы отправить объект в виде двоичного сериализованного объекта.
Однако, если я делаю это, то объект CameraFrame отсутствует в моделях сваггера, а также, когда я генерирую клиента с помощью NSwagStudio, он также не генерирует контракт для объекта.
Как я могу отправить объект CameraFrame в двоичном формате и затем десериализовать / реконструировать объект на стороне клиента, предпочтительно сгенерированный с помощью NSwagStudio, как мы делаем в настоящее время для webapi? Или, если через NSwagStudio это невозможно, то как мне сделать это вручную?
Объект, который я должен выставить sh:
[Serializable]
public class CameraFrame
{
public CameraFrame(long frameNumber, int width, int height, int stride, byte[] image, double position = double.NaN)
{
FrameNumber = frameNumber;
Width = width;
Height = height;
Stride = stride;
Position = position;
Image = image;
}
public long FrameNumber { get; }
public double Position { get; set; }
public byte[] Image { get; set; }
public int Width { get; }
public int Height { get; }
public int Stride { get; }
public int BytesPerPixel => Width > 0 ? Stride / Width : 0;
}
Контроллер:
public class CameraController : ApiController
{
...
[Route("api/v1/camera/buffer/{frameNumber}")]
[HttpGet]
public HttpResponseMessage GetFrame(long frameNumber)
{
return dataProviderService.Get(frameNumber).ConvertCameraFrameToMimeResponseMessage(); ;
}
...
}
Конвертер:
public static HttpResponseMessage ConvertCameraFrameToMimeResponseMessage(this CameraFrame image)
{
var result = new HttpResponseMessage(HttpStatusCode.OK);
BinaryFormatter bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, image);
result.Content = new ByteArrayContent(ms.ToArray());
}
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
Запуск:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
app.MapSignalR();
// Setup Swagger
app.UseSwaggerUi3(typeof(Startup).Assembly, settings =>
{
settings.DocumentPath = "/docs/v1/swagger.json";
settings.Path = "/docs";
settings.GeneratorSettings.DefaultUrlTemplate = "api/v1/{controller}/{id}";
settings.PostProcess = document =>
{
document.Info.Title = "....";
document.Info.Description = "....";
document.Info.Version = versionInfo.FileVersion;
};
});
}
}