如何从HttpWebResponse创建ODataMessageReader?

时间:2013-10-31 21:19:03

标签: c# .net odata

我正在使用Microsoft.Data.OData库,并且基本上想要构建一个程序,该程序从OData查询中获取DataTable,从中构造数据库,然后插入记录。

由于这需要是动态的,服务引用对我来说不起作用。

经过两个小时的搜索和筛选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
    }
}

1 个答案:

答案 0 :(得分:4)

使用ODataLib时,您需要自己实现一个消息接口(消息表示HTTP消息:stream&amp; headers)。当您阅读回复时,您需要实现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