先說下我的情況,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>
一直到這里,我的項目從開發到部署就已經全部完成了,其中出了很多問題,都是網上找的資料,加上自己的一點點經驗解決的,希望對其他人會有一點點幫助。