c# - 如何从 HttpWebResponse 创建 ODataMessageReader?

标签 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
    }
}

最佳答案

使用ODataLib时,您需要自己实现一个消息接口(interface)(其中消息代表HTTP消息:流和 header )。当您读取响应时,您需要实现 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

关于c# - 如何从 HttpWebResponse 创建 ODataMessageReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716797/

相关文章:

.net - 将数据加载到 Azure 突触分析的最佳方法

c# - 删除发布版本的 NUnit 引用

c# - 无法使用 SmtpClient 发送邮件

c# - 来自 C# 的 SQL 查询

c# - NameValueCollection 与 Dictionary<string,string>

c# - for 循环生成的工作线程列表超出了 for 循环迭代次数

c# - Web API OData v4 枚举本地化

c# - 这个 do...while 循环 C# 有什么问题?

java - 尝试使用 Java 将 OData $filter 解析为其名称-值对

c# - Odata DataContext 仅更新修改的属性