2014年12月1日 星期一

使用OData擴充ASP.NET Web API

 

Tool:Visual Studio 2013 Ultimate Update 4、OData Client Code Generator
OS:Windows 8.1
Microsoft ASP.NET Web API 2.2 for OData v4.0

本文改自原<使用OData擴充ASP.NET Web API>一文上半段。因ASP.NET Web API與OData開發相關套件改版,以致於程式語法和步驟有些不同。更新工具與設計步驟如下:

  • 建立ASP.NET Web API專案:

image

 

image

 

  • 從「Solution Explorer」視窗,選取專案下「Models」目錄,按滑鼠右鍵,選取「Add」-「New Item」加入一個新項目,選取「Class」,使用「Employee」當作名稱,按「Add」按鈕

image

 

  • 為Employee類別加入Id、EmployeeName與Age三個屬性:


  public class Employee {
    public int Id { get; set; }
    public string EmployeeName { get; set; }
    public int Age { get; set; }
  }


  • 加入以下程式碼,讓EmployeesDB繼承自DbContext類別:

public class EmployeesDB : DbContext {
  public DbSet<Employee> Employees { get; set; }
}


  • 接著再新增一個EmployeesInitializer類別,繼承DropCreateDatabaseAlways<T>類別,改寫 Seed方法:

public class EmployeesInitializer : DropCreateDatabaseAlways<EmployeesDB> {
  protected override void Seed( EmployeesDB context ) {
    base.Seed( context );
    var emps = new List<Employee>{
      new Employee {         
       EmployeeName = "Mary",
      Age =30
     },
       new Employee {         
       EmployeeName = "Candy",
      Age =25
     },
       new Employee {         
       EmployeeName = "Lili",
      Age =45
     }
    };
    emps.ForEach( s => context.Employees.Add( s ) );
    context.SaveChanges( );
  }
}

  • 修改專案根路徑下的Web.Config檔案,指定name為EmployeesDB:
<connectionStrings>
   <add name="EmployeesDB" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication8-20141201124938.mdf;Initial Catalog=aspnet-WebApplication8-20141201124938;Integrated Security=True"
     providerName="System.Data.SqlClient" />
</connectionStrings>
  • 接著在Global.asax檔案內Application_Start方法中,加入程式碼,叫用Database類別SetInitializer方法來初始資料庫結構和資料表資料:
protected void Application_Start( ) {
  AreaRegistration.RegisterAllAreas( );
  Database.SetInitializer<WebApplication8.Models.EmployeesDB>( new WebApplication8.Models.EmployeesInitializer( ) );
  GlobalConfiguration.Configure( WebApiConfig.Register );
  FilterConfig.RegisterGlobalFilters( GlobalFilters.Filters );
  RouteConfig.RegisterRoutes( RouteTable.Routes );
  BundleConfig.RegisterBundles( BundleTable.Bundles );
}

 

安裝套件

  • 使用NuGet下載 Microsoft ASP.NET Web API 2.2 for OData v4.0 5.3.1

image

建立支援OData的控制器

  • 「Solution Explorer」-專案-「Controllers」目錄上方按滑鼠右鍵,從快捷選單選擇「Add」-「Controller」。在這個階段Template設定為「Web API 2  controller Empty」,然後按下「Add 」按鈕:

image

  • 設定控制器名稱為「EmployeesController」;

image

  • 修改產生出的程式碼,讓EmployeesController類別繼承ODataController類別:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.OData;
using WebApplication8.Models;
namespace WebApplication8.Controllers
{
  public class EmployeesController : ODataController {
   EmployeesDB ctx = new EmployeesDB( );
    [EnableQuery]
    public IQueryable<Employee> Get( ) {
      return ctx.Employees;
    }
  }
}

設定OData Endpoint

  • 修改專案中的WebApiConfig.cs檔案,在WebApiConfig類別中Register方法中叫新增一個InitializeOData方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using Microsoft.Owin.Security.OAuth;
using Newtonsoft.Json.Serialization;
using System.Web.OData.Builder;
using Microsoft.OData.Edm;
using System.Web.OData.Extensions;
using WebApplication8.Models;
namespace WebApplication8
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
           InitializeOData( config );
        }
       private static void InitializeOData( HttpConfiguration config ) {
          ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder( );
          modelBuilder.EntitySet<Employee>( "Employees" );
          IEdmModel model = modelBuilder.GetEdmModel( );
          config.MapODataServiceRoute( routeName: "OData" , routePrefix: "odata" ,
                                                                model: model );
        }
    }
}

OData服務測試

  • 執行網站,開啟瀏覽器,輸入OData服務所在Endpoint:「http://localhost:29633/OData」,可以看到以下描述服務的XML:


image
  • 利用OData Query String Options「$metadata」來查詢Service Metadata Document

http://localhost:29633/OData/$metadata

  • 執行結果

image

  • 查詢Employees
  • 執行結果

image

 

安裝OData Client Code Generator

開啟Visual Studio 2013選單,Tools->Extension and Updates ,搜尋OData Client Code Generator,下載並安裝:

image

設計使用OData 的用戶端程式

  • 在方案中加入一個主控台應用程式當用戶端。在「New Project」選取「Console Application」,名稱設定為「ODataClient」。
  • 先按CTRL+F5 執行Web API專案
  • 在ODataClient專案加入 OData Client

image

  • 修改EmployeeClient1.tt檔案第九行程式碼,設MetadataDocumentUri的真正位置,

image

 

  • 然後儲存tt檔,此時就會在tt檔下方,出現一個cs檔案,裏頭包含叫用Web API的代理程式碼:

image

 

  • 在Main方法加入程式碼,呼叫Web API

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ODataClient {
  class Program {
    static void Main( string[ ] args ) {
      Console.WriteLine( "OData Client is running ... " );
      var container = new Default.Container( new Uri( "http://localhost:29633/OData" ) );
      var emps = ( from emp in container.Employees
                   orderby emp.EmployeeName ascending
                   select emp
                     );
      foreach ( var emp in emps ) {
        Console.WriteLine( emp.Id + " , " + emp.EmployeeName );
      }
      Console.ReadLine( );
    }
  }
}

  • 設定兩個專案同時執行

image

  • 按CTRL+F5 執行專案,Client執行結果,正確呼叫到Web API

 

image

沒有留言:

總瀏覽量