2016-02-11 1 views
1

Я новичок в protobuf и довольно новичок в asp .net. поэтому мне может понадобиться помощь в этом. У меня есть этот фрагмент кода для моего PersonsController:Что мне нужно сделать, чтобы отправить серийные данные Protobuf с помощью C# ASP.NET web api?

public class PersonController : ApiController 
{ 
    [ProtoContract] 
    public class Person 
    { 
     [ProtoMember(1)] 
     public int ID { get; set; } 
     [ProtoMember(2)] 
     public string First { get; set; } 
     [ProtoMember(3)] 
     public string Last { get; set; } 
    } 
    // GET api/values 
    public IEnumerable<Person> Get() 
    { 
     List<Person> myList = new List<Person> { 
      new Person { ID = 0, First = "Judy", Last = "Lee" }, 
      new Person { ID = 1, First = "John", Last = "Doe" }, 
      new Person { ID = 2, First = "George", Last = "Poole" }, 
     }; 

     return myList; 
    } 
} 

и мне интересно, если это достаточно, чтобы иметь возможность отправлять данные Protobuf и потребляться другими приложениями?

Я пытаюсь получить к нему доступ непосредственно в google chrome, и все, что я получаю, это формат данных XML.

<ArrayOfPersonController.Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SampleSerialize.Controllers"> 
 
    <PersonController.Person> 
 
    <First>Judy</First> 
 
    <ID>0</ID> 
 
    <Last>Lee</Last> 
 
    </PersonController.Person> 
 
    <PersonController.Person> 
 
    <First>John</First> 
 
    <ID>1</ID> 
 
    <Last>Doe</Last> 
 
    </PersonController.Person> 
 
    <PersonController.Person> 
 
    <First>George</First> 
 
    <ID>2</ID> 
 
    <Last>Poole</Last> 
 
    </PersonController.Person> 
 
</ArrayOfPersonController.Person>

Как я знаю, если я могу отправить сериализованные данные?

+0

вы должны определить формат данных, чтобы отправить свой API, XML, JSON, простой текст и т.д. – DanielVorph

+0

это может помочь http://www.infoworld.com/article/2982579/application-architecture/working- with-protocol-buffers-in-web-api.html – Jehof

ответ

2

Вам нужно сделать пару вещей:

  1. Вам нужен веб-клиент, который на самом деле запрашивает содержимое Protobuf-сериализованная в запрос-х Acceptheader. Chrome не делает этого - он запрашивает такие вещи, как text/html, image/* и т. Д., Которые вы ожидаете от веб-браузера. Для protobuf нет стандартного типа контента, поэтому вы можете просто определить свой собственный - многие используют application/x-protobuf. Существуют инструменты разработчика Chrome, такие как Advanced REST client, которые позволяют вам использовать API REST из браузера и, тем не менее, настроить заголовки запросов.

  2. С веб-интерфейсом API вам необходимо создать и зарегистрировать собственный медиаформат. Есть хорошее пошаговое руководство here. Вероятно, вы получите от BufferedMediaTypeFormatter, чтобы выполнить сериализацию protobuf (de /), и вы захотите настроить этот класс для обработки запросов application/x-protobuf. Затем вам необходимо зарегистрировать его в конвейере веб-API.

+0

Спасибо за ответ: 1. Я вижу, что ARC обнаруживает приложение/x-protobuf автоматически даже без установки заголовка в «Accept: application/protobuf». Означает ли это, что он автоматически расшифровывает сообщение? 2. У меня есть «config.Formatters.Insert (0, новый ProtoBufFormatter()); в WebApiConfig.cs. Должно ли это быть таким же, как вы упомянули? –

+0

Если для заголовка 'Accept' и заголовка ответа' Content-Type' для запроса выбрано значение application/x-protobuf, тогда да, ARC делает все правильно. Просто убедитесь, что ARC не запрашивает каких-либо дополнительных типов контента в запросе. И предположим, что ваш класс ProtoBufFormatter пришел из [здесь] (https://github.com/WebApiContrib/WebApiContrib.Formatting.ProtoBuf/blob/master/src/WebApiContrib.Formatting.ProtoBuf/ProtoBufFormatter.cs), да, вы делаете Правильная вещь в WebApiConfig.cs. ARC все еще возвращает XML в ответ? –

+0

yup, заголовок accept в ARC и Response.ContentType в коде оба установлены в application/x-protobuf. и yup класс ProtoBufFormatter пришел из того, с которым вы связались (фактически получил его от NuGet). Я получаю только обычный текст в ответе в ARC. Ожидается ли это? Я ожидаю, что он должен быть двоичным. –

Смежные вопросы