2017-01-09 10 views
2

Я ищу в использовании Protobuf для передачи данных между моими Microservices и Я использую C# поддержки в Google.ProtoBuf и не ProtoBuf-Net, так как я хочу, чтобы скомпилировать классы от .proto files ,Использование Protobuf в .Net Ядра с .proto файлами

Причина этого в том, что Microservices не являются строго .Net. Некоторые из написаны Go и т.д.

Я ищу что-то вроде ProtoBufFormatter в пакете WebApiContrib.Formatting.ProtoBuf, но поддерживают Google.ProtoBuf.

ProtoBufFormatter возвращает сериализованные данные protobuf, если клиент установил тип контента application/x-protobuf, в противном случае Json.

Как я могу достичь чего-то подобного для Google.ProtoBuf? Далее я также ищу такую ​​поддержку для Nancy Framework на .Net Core.

Я нашел это link, где объясняется, как использовать protobuf-файлы с Protobuf-Net, но не кажется актуальным (.Net Core + VSCode).

ответ

0

я не мог найти решение для моего случая использования с Google.Protobuf, поэтому я использовал пользовательские InputFormatter и OutputFormatter как в this блоге, с 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.