我正在使用Microsoft.Data.OData
库,基本上是想构造一个程序,该程序从OData查询中获取DataTable
,从中构造数据库,然后插入记录。
由于这是动态的,因此服务引用对我而言不起作用。
经过两个小时的搜索和筛选有关MSDN的文档后,我还没有想出解决我的问题的方法。
到目前为止,我的代码在下面,我只需要知道是否有人从HttpWebRequest
到ODataReader
或任何相关的类,这些类可以让我无需编写自己的解析器即可读取查询结果,以及他们做到了。
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时,您需要自己实现一个消息接口(消息代表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
关于c# - 如何从HttpWebResponse创建ODataMessageReader?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19716797/