2016-02-11 35 views
1

我是protobuf的新手,對asp.net很新。所以我可能需要幫助。我有這樣的代碼片段我PersonsController:使用C#ASP .NET web api發送Protobuf序列化數據需要做什麼?

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數據和其他應用程序使用?

我試圖直接在谷歌瀏覽器中訪問它,我得到的是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序列化的內容 Web客戶端請求的Acceptheader。 Chrome並沒有這樣做 - 它只會要求諸如text/html,image/*等東西,這些東西你可能期望Web瀏覽器要求。 protobuf沒有標準的內容類型,所以你可以自己定義 - 很多人使用application/x-protobuf。有一些Chrome開發者工具,例如Advanced REST client,可讓您從瀏覽器執行REST API,並根據需要設置您的請求標頭。

  2. 在Web API方面,您需要創建並註冊自己的媒體格式化程序。有一個很好的演練here。你可能從BufferedMediaTypeFormatter派生出protobuf(de /)序列化,並且你需要配置這個類來處理application/x-protobuf請求。然後,您需要使用Web API管道註冊它。

+0

感謝您的回覆: 1.我可以看到,即使沒有將標頭設置爲「Accept:application/protobuf」,ARC也會自動檢測application/x-protobuf。這是否意味着它會自動解碼消息? 2.我有「config.Formatters.Insert(0,new 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,ARC中的accept頭和代碼中的Response.ContentType都設置爲application/x-protobuf。而且ProtoBufFormatter類來自你鏈接的那個(實際上是從NuGet獲得的)。我在ARC中的回覆中只顯示純文本。這是預期的嗎?我期待它應該是二元的。 –

相關問題