IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Portable Class Library中如何调用WCF OData Service

    汪宇杰发表于 2014-07-21 06:41:10
    love 0

    上个月发布了一个WP8.1应用:NuGet Search,并在GitHub开了源:https://github.com/EdiWang/WP-NuGetSearch

    NuGet的服务接口是个WCF OData Service,为了装逼,我尝试使用了跨Framework的PCI工程,结果no zuo no die了。和一般.NET类库不同,PCL有些tricky的地方要爆。下面是开荒成功的代码:

    public async Task>> GetDataAsync(string searchTerm, int pageIndex, bool includePreRelease = false)
     {
         try
         {
             IDictionary queryOptions = new Dictionary {
                 { "filter", "IsLatestVersion" },
                 { "searchTerm", "'" + UrlEncodeOdataParameter(searchTerm) + "'" },
                 { "includePrerelease", includePreRelease.ToString().ToLower() }
             };
     
     
             if (pageIndex < 1)
             {
                 pageIndex = 1;
             }
     
     
             int startRow = (pageIndex - 1) * PageSize;
             var nquery = context.CreateQuery("Search")
                                 .OrderByDescending(p => p.DownloadCount)
                                 .Skip(startRow)
                                 .Take(PageSize);
     
     
             var query = (DataServiceQuery)nquery;
             if (queryOptions.Any())
             {
                 query = queryOptions.Aggregate(query, (current, pair) => current.AddQueryOption(pair.Key, pair.Value));
             }
     
     
             var taskFactory = new TaskFactory>();
             var result = await taskFactory.FromAsync(query.BeginExecute(null, null), query.EndExecute);
             var packages = result.ToList();
     
     
             return new Response>()
             {
                 IsSuccess = true,
                 Item = packages
             };
         }
         catch (Exception e)
         {
             return new Response>()
             {
                 Message = e.Message
             };
         }
     }

    需要注意的:

    1. 对于非标准的操作符,需要使用“AddQueryOption()”方法把它们撸进去,就像我代码里一样,用了个字典包装这些参数

    IDictionary queryOptions = new Dictionary {
        { "filter", "IsLatestVersion" },
        { "searchTerm", "'" + UrlEncodeOdataParameter(searchTerm) + "'" },
        { "includePrerelease", includePreRelease.ToString().ToLower() }
    };
    

    2. 由于OData Client的PCL版本只支持异步操作,但它又没暴露基于Task的异步方法(你TM在逗我?),我们只能用TaskFactory把IAsyncResult撸成awaitable的Task

    var taskFactory = new TaskFactory>();
    var result = await taskFactory.FromAsync(query.BeginExecute(null, null), query.EndExecute);

    3. 对于标准LINQ操作,OData库可以正确翻译到URL,所以可以放心写这样的查询语句:

    var nquery = context.CreateQuery("Search")
                        .OrderByDescending(p => p.DownloadCount)
                        .Skip(startRow)
                        .Take(PageSize);

    翻译后的URL:

    https://www.nuget.org/api/v2/Search()?$orderby=DownloadCount
    desc&$skip=0&$top=30

    带参数字典的:

    https://www.nuget.org/api/v2/Search()?$orderby=DownloadCount
    desc&$skip=0&$top=30&filter;=IsLatestVersion&searchTerm;=''&includePrerelease;=false

    4. Response格式的例子:

    
    
      https://www.nuget.org/api/v2/curated-feeds/microsoftdotnet/Search
      Search
      2014-06-01T02:31:18Z
      
      
        https://www.nuget.org/api/v2/curated-feeds/microsoftdotnet/Packages(Id='EntityFramework',Version='6.1.0')
        
        
        EntityFramework
        Entity Framework is Microsoft's recommended data access technology for new applications.
        2014-05-20T18:39:08Z
        
          Microsoft
        
        
        
        
          6.1.0
          6.1.0
          
          2014-03-17T21:38:19.813
          
          Entity Framework is Microsoft's recommended data access technology for new applications.
          5345924
          https://www.nuget.org/packages/EntityFramework/6.1.0
          http://go.microsoft.com/fwlink/?LinkID=386613
          true
          false
          false
          en-US
          2014-03-17T21:38:19.877
          u/M0OEfqxTUsL5BwzD66eBGm278/ozqdLK3JvMO6QwUxxc+z7ZUkTYm4suDhWRqzkc6mOhvXDQY5dZUwbldxyQ==
          SHA512
          4222059
          http://go.microsoft.com/fwlink/?LinkID=320540
          https://www.nuget.org/package/ReportAbuse/EntityFramework/6.1.0
          
          true
          Microsoft EF Database Data O/RM ADO.NET
          EntityFramework
          345877
          
          
          http://go.microsoft.com/fwlink/?LinkID=320539
          
          
        
      
    .....
    .....
     


沪ICP备19023445号-2号
友情链接