Использование Protobuf в.Net Core с файлами.proto
Я пытаюсь использовать Protobuf для передачи данных между моими Microservices, и я использую поддержку C# в Google.ProtoBuf
и не ProtoBuf-Net
, так как я хочу скомпилировать классы из .proto files
,
Причина этого в том, что микросервисы не являются строго.Net. Некоторые из написаны в Go
и т.п.
Я ищу что-то вроде ProtoBufFormatter
в упаковке WebApiContrib.Formatting.ProtoBuf
, но поддержка Google.ProtoBuf
,
ProtoBufFormatter
возвращает сериализованные данные protobuf, если клиент установил тип контента в application/x-protobuf
, иначе Json
,
Как я могу добиться чего-то похожего для Google.ProtoBuf
? Кроме того, я также собираюсь найти такую поддержку Nancy Framework на.Net Core.
Я нашел эту ссылку, где объясняется, как использовать файлы Protobuf с Protobuf-Net, но она не выглядит актуальной (.Net Core + VSCode).
1 ответ
Я не мог найти решение для моего варианта использования с Google.Protobuf
так что я использовал кастом InputFormatter
а также OutputFormatter
как в этом сообщении в блоге, с Protobuf-Net
,
Затем для вызова и десериализации содержимого protobuf на клиенте я предложил следующее решение:
var client = new System.Net.Http.HttpClient { BaseAddress = new Uri("http://localhost:5002") };
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-protobuf"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync("api/home");
if (response.IsSuccessStatusCode)
{
if (response.Content.Headers.ContentType.MediaType == "application/x-protobuf")
{
using(var stream = await response.Content.ReadAsStreamAsync())
{
var protoBufModel = ProtoBuf.Serializer.Deserialize<ProtobufModelDto>(stream);
return $"{protoBufModel.Name}, {protoBufModel.StringValue}, {protoBufModel.Id}";
}
}
var content = await response.Content.ReadAsStringAsync();
var jsonModel = JsonConvert.DeserializeObject<ProtobufModelDto>(content);
return $"{jsonModel.Name}, {jsonModel.StringValue}, {jsonModel.Id}";
}
return "Failed";
Следующим шагом будет выяснить, как создавать модели из .proto
файлы с Protobuf-Net
,