2012年10月3日 星期三

Web AP在IIS的相關權限設定


Web 程式在本機上執行,通常寫事件檢視器和檔案的權限是預設為最高權限。
所以執行起來不會有什麼問題,但是一旦真正上到IIS後,才會開始發現一些問題,而大部分都是因為權限沒有設定好的關係。

可以先參考保哥這篇文章,超級推薦:

此篇文章針對以下兩個項目的寫入權限做說明。
1.      寫事件檢視器
2.      使用Log4Net寫檔



OS Windows 2008 R2
IIS
版本: 7.5


寫事件檢視器
如果看了保哥的文章,就知道IIS7.5集區會預設以 ApplicationPoolIdentity」這個帳戶來執行。


所以我們只要把它加到有寫入/瀏覽
事件檢視器權限的群組: Event Log Readers

但是我們指定的帳戶名稱必須是: IIS AppPool\應用程式集區名稱
這樣才能對應到要設定權限的集區。

 




Web AP的集區名稱為ASP.NET v4.0,所以我就輸入使用者名稱:IIS AppPool\ASP.NET v4.0

檢查名稱後,系統就自動辨識了。 這支在IIS上的Web AP就有權限可以寫事件檢視器了。







使用Log4Net寫檔

一般我們都是把log4net.xml , log4net.dll 和我們要寫入的檔案放在一起就可以寫檔了。
但是因為Web AP路徑的緣故,常常是程式讀取不到log4net.xml
所以放在 AssemblyInfo.cs log4net設定字串,還是乖乖打上所在的資料夾名稱:./App_Data/log4net.xml

//log4net
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "./App_Data/log4net.xml", ConfigFileExtension = "xml", Watch = true)]


然後log4net.xml裡面設定的file value也是乖乖打上資料夾名稱:./App_Data/Error.log

<file value="./App_Data/Error.log" />


最後別忘了先新增Error.log,並把Error.log的讀寫權限打開。(因為是記錄檔&內部用,我就直接開Everyone了)

2012年9月10日 星期一

[UML] 案例圖範例一


今天參考書上畫的案例圖,來做一些筆記:

1. Customer 可以做為 Member 一般化的父角色。 因為Customer連接的所有案例,Member也會用到。
2. Provide Suggestion(顧客意見) 和 Order (下訂單) 如果在未登入的情況下,會<<extend>> 出 Login這個案例。 Order (下訂單) 如果在非會員的情況下,會<<extend>> "Join as a member"案例。

3. Order (下訂單)和Modify member info (修改會員資料) 一定會引發Send confirmed Email這個案例。 所以要使用 <<include>>這個關係。

4. 角色可以是 人, 時間, 系統 ... 等實體或非實體,有點像是觸發事件的Trigger。


[MVC4] 建立第一支Web Api


[MVC4] 建立第一支Web Api
作者 : JB

MVC4
Web api是走Restful的網路服務架構,在開發流程上與WCF Restful service很像。

 
1. 請先下載安裝ASP.NET MVC4
http://www.microsoft.com/zh-tw/download/details.aspx?id=30683
(
此連結的下載是For Visual Studio 2010)
2. 以下以Visaul Studio 2010為範例。

開新專案:
Web】→【ASP.NET MVC 4 Web Application


會跳出以下這個畫面,選擇Web API,然後可選擇要不要建立單元測試專案。
 

 
3.      建立好之後,可看到方案總管,的確跟一般MVC專案一樣有Model, View, Control。 不過因為基本上不會動到View J

 


 

 
4. 打開Control資料夾下面的「ValuesController.cs
可看到裡面定義了四個Restful Service的方法
 
// GET api/values
public IEnumerable< string > Get()
{
  return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
  return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}

5.       接著我們來看定義routes的地方,開啟App_Start資料夾下面的WebApiConfig.cs
會看到以下的程式碼
     public static void Register(HttpConfiguration config)
    { 
          config.Routes.MapHttpRoute(   name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

很清楚的可以看到
routes定義為 api/{controller}/{id}{controller} : 你的Control名稱{id} : 帶入的值(參數),而id = RouteParameter.Optional 則定義此欄位為非必要。
 
6.    接下來就直接來跑看看吧! 執行(F5)Web API,會出現如下的畫面:




 
7.       測試GET方法

在網址後面加上 http://localhost:XXXX/api/values
瀏覽器應該會問你要不要下載檔案,這個就是Web API回傳回來的JSON資料,打開這個檔案會看到
["value1","value2"]

下圖是用Fiddler看的結果
 


備註:如果我們要讓使用者在GET方法時,動態選擇取得的response格式為XMLJSON,做法如下:

打開Global.asax.cs,在Application_Start方法中加入下列紅色的程式碼。
PS.
必須參考 using System.Net.Http.Formatting

//
設定一個URL的新參數
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("json", "true", "application/json"));
//設定一個URL的新參數
GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "text/xml"));

這兩行表示我們可以在URL中加入jsonxml兩個參數,來設定是否開啟json/xml回傳格式。

所以預設回傳json格式的URL可以改打
http://localhost:63435/api/values?id=10&json=true

如果要拿到xml格式,就改打以下網址
http://localhost:63435/api/values?id=10&xml=true


 
8.       測試POST方法
新增一個類別 CItem,裡面放兩個String變數value1value2
然後修改 POST函式:

// POST api/values
public CItem Post()
{
CItem myItem = new CItem();
myItem.value1 = "HI";
myItem.value2 = "HELLO";
return myItem;
}

打開Fiddler,如下設定,
如果要得到XMLresponse就在 Request Headers裡面打入
content-Type: text/xml


按下執行後的結果:
 

 
9.      恩,如果我們不想使用專案預設的ValuesController,可以自己新增一個,如 JBController”。 至於依原始routes設定,呼叫rest方法的URL就要改成
http://localhost:XXX/api/JB