vs2012 + web api + OData + EF + MYsql 開發及部署

先說下我的情況,b/s開發這塊已經很久沒有搞了,什麼web api 、MVC、OData都只是聽過,沒有實際開發過,因爲最近要開發一個手機app的服務端,所以準備用這套框架來開發。

下面開始進入正題(我儘量將自己開始寫代碼遇到的所有問題還原,以便以後提醒自己,文章是在我開發部署完畢後開始寫的,所以有些地方有遺漏,還請見諒)

1:首先用vs2012新建一個“asp.net 空 web 應用程序”,(注意,我選擇的是.net 4.0版本,原因後面會解釋)

2:這個時候項目應該是空白的一片,什麼都沒有。首先我們要在項目引用中添加幾個dll的引用“System.Web.Http,System.Web.Http.WebHost,System.Net.Http,Newtonsoft.Json”

  除了Newtonsoft.Json,其他三個dll可以直接在引用裏面找到,Newtonsoft.Json需要用“程序包管理器控制檯”來加載,命令如下“install-package Newtonsoft.Json”,不區分大小寫

3:創建model、controller文件,在項目中的位置自己定義,文件代碼內容如下:

    public class User
    {
        public string UserID { get; set; }
        public string UserName { get; set; }
    }
 public class UserController : ApiController
    {
        public User Get()
        {
            return new User() { UserID = "000", UserName = "Admin" };
        }

        public bool add(User user)
        {
            return user != null;
        }
    }

(以上代碼是我在網上找demo時搜到的,並非自己原創,大家見諒)

3:創建路由規則,(這塊應該是屬於MVC的知識,只是以前由vs自動創建,現在由自己手寫)

定義一個類

public class WebApiConfig
{
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );            
        }
 }

然後自己手動添加一個Global文件,並添加以下代碼

protected void Application_Start(object sender, EventArgs e)
{
    WebApiConfig.Register(GlobalConfiguration.Configuration);
}

Ok,到這裏爲止,一個由vs2012創建的web api程序已經完成。

啓動vs,在瀏覽器輸入“localhost:端口號/api/user”就可以訪問了

(以上代碼參考網絡資料,請原諒我忘記原始地址了.)

 

一直到上面的代碼,都很順利,至少我在開發的過程中沒有遇到過問題,下面開始,就會出現各種問題。

現在開始添加對OData的支持,利用NuGet來添加對OData的支持

如圖,會出現兩個選擇,一個是v1-3,一個是v4版本的。這裏我選擇的是v1-3的,因爲聽說v4版本好像還不太穩定。

(說一下我在這裏遇到的問題,一開始創建項目時選擇的是.net 4.0版本的,如果選擇的是4.5默認版本的話,添加 Odata v4版本會提示對4.5不支持之類的信息,如果添加OData v1-3版本的話,在添加成功後,運行項目,

這時候項目時會報錯的,請原諒我才疏學淺,沒有搞清楚是什麼原因就放棄了。因爲我發現使用.net 4.0版本添加OData v1-3項目是不報錯的,當然這也是我試過很多解決方法後解決的)

 

添加OData組件後,需要在項目中做一些修改,針對Controller文件,將UserController的代碼修改如下:

[Queryable]
public IQueryable<User> get() {
    return new User[] { new User() { UserID = "000", UserName = "Admin" } }.AsQueryable();
}

ok,就是這麼簡單,現在可以在瀏覽器中瀏覽數據了,我這裏只做了一條數據,所以瀏覽時看不出什麼效果

如果多做幾條數據,用如下url是可以正確訪問的:

localhost:端口/api/user?$top2

localhost:端口/api/user?$filter=UserId eq '000'

請注意一點,OData是大小寫敏感的。

 

OK,下面開始用EF添加對Mysql的支持。

首先需要下載安裝組件:“mysql-connector-net-6.6.7.msi” ,這個在官網上下載就好了,不過要註冊,有點麻煩.

然後安裝ef,使用“程序包管理器控制檯”來加載,命令如下“install-package entityframework”,

安裝好之後,重啓vs,在項目裏面選擇“新建項”

如圖選擇,填好名稱,點擊添加

這裏有些版本的選擇會不一樣,我的只有這兩個選項,選擇“從數據庫生成”即可,點擊下一步

這裏填寫你的Mysql的ip、用戶名、密碼確定即可。

(在安裝“mysql-connector-net-6.6.7.msi” 時,如果你的開發機器安裝過mysql的相關軟件,可能會出一些問題,一般是在“程序和功能”中將原來的刪除掉,

安裝新的就可以了,不然會在選擇數據源時,沒有“Mysql database”這個選項)

這時在項目中會出現一個“*.edmx”文件,這就是ef創建的文件

這時新建一個Controller文件,自己隨意命名,代碼如下:

public class ProductController : ApiController
    {
        [Queryable(AllowedOrderByProperties = "id", AllowedQueryOptions = AllowedQueryOptions.All)]
        public IQueryable<map_goodsdiscount> Get()
        {
            var db = new testEntities();
            return db.map_goodsdiscount.AsQueryable();
        }
    }

其中:

map_goodsdiscount是你在Mysql中對應的數據表名稱,
testEntities是你用EF建Mysql數據源填寫的名稱
Queryable屬性中AllowedOrderByProperties 表示默認排序按照“id”字段
AllowedQueryOptions 屬性控制Odata查詢條件,比如

到這裏爲止,所有代碼都已經寫完,如果有什麼遺漏的,發現之後,我再添加上去。

下面開始部署,部署環境爲windows server 2008 r2,已經安裝4.0環境,這裏將部署時注意的事項一併列出來
1:項目中ef的版本問題,默認是4.5的,部署時需要刪除entityframework引用,並添加4.0版本的dll,我本機的4.0地址爲:

C:\Program Files (x86)\Microsoft Web Tools\Packages\EntityFramework.5.0.0\lib\net40
修改配置文件web.config爲如下格式:
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

 

2:如果在部署的時候遇到404錯誤,添加以下代碼在web.config

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
  <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

 

一直到這裏,我的項目從開發到部署就已經全部完成了,其中出了很多問題,都是網上找的資料,加上自己的一點點經驗解決的,希望對其他人會有一點點幫助。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章