最近做了一個web服務,開始什么也不懂,就在網上到處找,對於剛畢業的我,感覺沒用實際代碼經過自己的手寫出來,看什么都一頭霧水,然后就看到很多人說webservice已經融入WCF..然后就先創建了WCF..結果感覺不是我想要的 ....,經過很多次以后,其實webservice 也可以單獨分出來.然后就來做做筆記,希望大神能指點
1.首先創建web
然后在添加完成的應用程序里面點右鍵添加,新建項
好了這樣就創建好了一個服務..
2 然后,接着開始寫webservice 封裝接口..為了方便以后擴展首先分層BLL,DAL,Model,Web(這里補充一下,數據庫用的是Sybase)
所以現在配置文件connectionStrings下面配置數據庫
<connectionStrings> <!--DSN ODBC數據源--> <add name="DSN" connectionString="數據庫名"/> <!--加密鎖配置--> <add name="organ" connectionString="8888"/> <add name="lockip" connectionString="地址"/> <add name="nature" connectionString="0"/> </connectionStrings>(這里好像在配置sybase時可以自動就生成了)
3.然后開始寫方法了..
先創建一個相關類
public partial class AddTea { public AddTea() { this.TeaID = ""; this.Name = ""; } public AddTea(string _teaid,string _name) { this.TeaID = _teaid; this.NAME = _name; } /// <summary> /// 編碼 /// </summary> public string TeaID { get; set; } /// <summary> /// 名稱 /// </summary> public string NAME { get; set; } }
方法:
#region 添加方法--方法上面必須加上[WebMethod] /// <summary> /// 添加方法 /// </summary> /// <param name="data">調用時傳進來的參數(json字符串)</param> [WebMethod] public string Addtea(string data) { string json = ""; //序列化傳進來的字符串(序列化的時候AddTea是自己根據業務創建的一個實體類然后進行序列化) AddTea add = JSONSerializer.Deserialize<AddTea>(data); //調用業務層添加方法這里面的//GetCon是一個通過機構號獲取門店數據庫連接密碼 返回鏈接字符串 json = this.AddTeaBLL.AddTea(add, GetCon()); //判斷json是否為空 if(!string.IsNullOrEmpty(json)) { //成功時相應的數據 return "{\"FALSE\":\"0\",\"msg\":\"成功!\"}"; } else { //失敗是的處理 return "{\"FALSE\":\"0\",\"msg\":\"成功!\"}"; } } #endregion }
BLL,DAL層相關
//BLL AddteaDAL addteaDAL = new AddteaDAL(); /// <summary> /// 添加 /// </summary> /// <param name="_addtea">添加類</param> /// <param name="con">字符串連接</param> /// <returns></returns> public string AddTea(Addtea _addtea, string _con) { return this.addteaDAL.AddTea(_addtea, _con); } //DAL /// <summary> /// 添加 /// </summary> /// <param name="_data"></param> /// <param name="_con"></param> public string AddTea(AddTea _data, string _con) { string sql = "insert into AddTea(ID,PRICE)VALUES(:ID,:PRICE)"; OdbcParameter[] parmbm = new OdbcParameter[] { new OdbcParameter("ID",data.ID), new OdbcParameter("PRICE",data.PRICE) }; Helper.ExecuteNonQuery(sqlbm, con, parmbm); //調用存儲過程需要的參數 OdbcParameter[] odbcparm = new OdbcParameter[] { new OdbcParameter(), new OdbcParameter() }; odbcparm[0].OdbcType = OdbcType.NVarChar; odbcparm[0].ParameterName = ":TeaID"; odbcparm[0].Value = data.TeaID; odbcparm[1].OdbcType = OdbcType.NVarChar; odbcparm[1].ParameterName = ":NAME"; odbcparm[1].Value = data.NAME; //調用存儲過程(?號代表參數,一個問號代表一個參數) //returnvalue接受存儲過程返回的錯誤信息 object returnvalue=Helper.ExecuteNonQuery("存儲過程名 ?,?", con, CommandType.StoredProcedure, odbcparm) }
上面執行存儲過程的方法是重載的一個添加方法只是多了一個(CommandType參數)
}
這是上面存儲過程重載的一個方法和錯誤日志記錄的方法
/// <summary> /// 執行存儲過程 /// </summary> /// <param name="sql"></param> /// <param name="con"></param> /// <param name="_commandType"></param> /// <param name="spms"></param> /// <returns></returns> public static object ExecuteNonQuery(string sql, string con, CommandType _commandType, params OdbcParameter[] spms ) { OdbcCommand command = PrepareCommand(sql, con, spms); command.CommandText = sql; command.CommandType = CommandType.StoredProcedure; //command.Parameters.Add("SQLCODE","").Direction = ParameterDirection.ReturnValue; object result = ""; try { if (_commandType == null) { command.CommandType = CommandType.Text; } else { command.CommandType = _commandType; } command.Connection.Open(); result = command.ExecuteScalar(); //result += command.Parameters["SQLCODE"].Value.ToString(); } catch (Exception e) { result=e.Message;//接受錯誤信息返回去 WriteError(e,"");//記錄錯誤日志 } finally { if (command.Connection.State != ConnectionState.Closed) command.Connection.Close(); } return result; } /// <summary> /// 記錄錯誤日志方法 /// </summary> /// <param name="ex"></param> /// <param name="LogAddress"></param> public static void WriteError(Exception ex, string LogAddress = "") { //如果日志文件為空,則添加至"C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\DevServer\\10.0, YYYY-mm-dd_Log.log文件 if (LogAddress == "") { LogAddress = Environment.CurrentDirectory + '\\' + DateTime.Now.Year + '-' + DateTime.Now.Month + '-' + DateTime.Now.Day + "_Log.log"; } //把異常信息輸出到文件 StreamWriter fs = new StreamWriter(LogAddress, true); fs.WriteLine("當前時間:" + DateTime.Now.ToString()); fs.WriteLine("異常信息:" + ex.Message); fs.WriteLine("異常對象:" + ex.Source); fs.WriteLine("調用堆棧:\n" + ex.StackTrace.Trim()); fs.WriteLine("觸發方法:" + ex.TargetSite); fs.WriteLine(); fs.Close(); }
這樣大概的方法就完成。 然后對於新手了我"發布“這個概念也有點不清楚然后網上又是一堆質料最后參考這個地址發布
http://blog.sina.com.cn/s/blog_517cae3c0102v0y7.html
最后在按照這個地址里面的教學出現了兩個問題
問題1.
最后在網上找到解決方法iis里面的目錄瀏覽啟動:
然后沒事了 ..繼續 又報錯了 。!!
"/"應用程序中的服務器錯誤.
無法識別的屬性"targetFramework".請注意屬性名稱區分大小寫.
雖然都是一些簡單的錯對於剛畢業的我 還是挺頭疼的 然后又自己接着網上找.最后解決了
在IIS里面這樣操作兩步
第一步:
第二步:
最后千辛萬苦終於,完成了。》。現在回首其實比之前開始做做的時候想的要簡單得多..這只是自己的做法,也只是大概的寫了下..當然中途也不止
這幾個問題..只是提出個別的