2013-10-31 54 views
2

我正在使用Microsoft.Data.OData庫,基本上想要構建一個程序,它從OData查詢中抓取DataTable,從中構建數據庫並插入記錄。如何從HttpWebResponse創建ODataMessageReader?

由於這需要動態,服務引用不會爲我工作。

經過兩個小時的搜索和篩選MSDN上的文檔,我還沒有拿出解決我的問題。

我的代碼到目前爲止是在下面,我只需要知道是否有人從HttpWebRequestODataReader或任何相關的類,讓我讀取查詢的結果,而無需編寫我自己的解析器,他們做到了。

public class ODataPuller 
{ 
    private readonly Uri uri; 

    public ODataPuller(Uri uri) 
    { 
     this.uri = uri; 
    } 

    private async Task<HttpWebResponse> MakeRequestAsync(string filter) 
    { 
     filter = "?$filter=" + filter; 
     Uri target = new Uri(this.uri, filter); 

     HttpWebRequest request = HttpWebRequest.CreateHttp(target); 
     request.Headers["Accept"] = "application/xml"; 

     HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse; 
     return response; 
    } 

    public async Task<DataTable> GetDataTableAsync(string filter) 
    { 
     HttpWebResponse response = await this.MakeRequestAsync(filter); 

     Stream stream = response.GetResponseStream(); 

     // Turn this stream into something nice 
    } 
} 

回答

3

使用ODataLib,你需要實現一個消息接口自己(其中一個消息,表示HTTP消息:流&頭)。在閱讀回覆時,您需要實現IODataResponseMessage,並且在編寫請求時,您需要實現IODataRequestMessage。

我們有一些HttpWebRequest和HttpWebResponse的示例消息實現,您可以使用here。 (我認爲這些可能存在一些編譯問題,但是它們不應該太難以修復)

一旦你有了消息實現,就會將它傳遞給ODataMessageReader或ODataMessageWriter構造函數。例如,

using (var messageReader = new ODataMessageReader(responseMessage, readerSettings, model)) 
{ 
    var feedReader = messageReader.CreateODataFeedReader(entityType, entitySet); 
    while (feedReader.Read()) 
    { 
     switch(feedReader.State) 
     { 
      case ODataReaderState.EntryEnd: 
      { 
      ODataEntry entry = (ODataEntry) feedReader.Item; 
      // access entry.Properties, etc. 
      break; 
      } 
     } 
    } 
} 

對於使用該庫的文檔,你可以檢查出this summary of using the library 以及我ODataLib博客:http://odata.jenspinney.com

+0

光榮。您在博客中支持這一點很有幫助。我一定會檢查出來。 –