WinForm+WCF+mysql+http實現簡單的使用者登入註冊
一:建立WCF服務
點選檔案,選擇“新建" --> "專案",在Visual C#目錄下選擇,WCF服務應用程式。
二:使用WCF連線mysql資料庫
在資料庫建立相應的資料表,在wcf中呼叫mysql資料庫,需要引入mysql的動態連結庫Mysql.Data.dll,可從網上直接下載,在專案中引用 Mysql.Data.dll(具體的引入步驟會在下面介紹),在操作類當中新增相應的類
2.1 準備步驟:
2.2. 新增Mysql.data.dll引用,
將Mysql.data.dll下載後,選一個位置存放,然後在專案名稱下的 “引用“上右擊選擇“新增引用”,即可進入如下介面,選擇瀏覽,將其上傳。
2.3 在新建的專案中,會包含“IService1.cs”“Service1.svc”,這是專案初始化時自帶的,如不需要可將其刪除。
2.4 新增自己的WCF服務
在專案名稱上右擊,選擇 ”新增“選項,然後選擇 ”新建項“,然後選擇”WCF服務“即可。
新建WCF服務後,會生成兩個檔案 :registerAndLogin.svc 和 IregisterAndLogin.cs兩個檔案,其中 registerAndLogin.svc中書寫具體的類,和具體類函式的實現;IregisterAndLogin.cs 是 registerAndLogin.svc類抽調出的介面,供外部客戶端呼叫。
2.5 Mysql資料庫連線,在registerAndLogin.svc中的具體實現。
- registerAndLogin.svc(此處登入使用的MySqlDataAdapter ,返回datatable供winform使用,註冊MySqlCommand 。)
在呼叫mysql的資料庫服務時,首先需要在標頭檔案中引入對應的檔案
using MySql.Data;
using MySql.Data.MySqlClient;
然後配置mysql相關的引數,並建立一個connect的連線物件
const string sqlconfig = "Server = localhost; Port= 3306;Uid=root;Pwd=123456;Database=cnn"; MySqlConnection conn = new MySqlConnection(sqlconfig);
編寫資料庫的open和close函式,以供在具體的功能函式中掉用
public void opendataBase()
{
conn.Open();
}
public void closedataBase()
{
conn.Close();
}
編寫登入函式 (sql 語句採用完全拼接的形式)
由於登入函式會返回資料集,所以使用 MySqlDataAdapter 來執行sql語句, 給客戶端返回一個DataSet物件。
public DataSet login(string username, string password)
{
try
{
opendataBase();
string sql = "select * from user where username ='" + username + "'";
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds;
}
catch (Exception e)
{
throw e;
return null;
}
finally
{
closedataBase();
}
}
編寫註冊函式 (sql 語句採用佔位符的形式)
佔位符”@username“ 和 ”@password“使用如下語句賦值。
MySqlParameter parn = new MySqlParameter("@username", username);
cmd.Parameters.Add(parn);
MySqlParameter parp = new MySqlParameter("@password", password);
cmd.Parameters.Add(parp);
由於註冊執行inser命令,會返回一個整型數字,表示資料庫中受影響的行數,所以使用 MySqlCommand 來執行sql語句, 給客戶端返回一個int物件。
public int register(string username, string password)
{
try
{
opendataBase();
string sql = "insert into user(username, password) values (@username, @password)";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlParameter parn = new MySqlParameter("@username", username);
cmd.Parameters.Add(parn);
MySqlParameter parp = new MySqlParameter("@password", password);
cmd.Parameters.Add(parp);
//result接受受影響的行數,也就是說大於0的話表示新增成功
int result = cmd.ExecuteNonQuery();
cmd.Dispose();
return result;
}
catch (Exception e)
{
throw e;
}
finally
{
closedataBase();
}
}
registerAndLogin.svc 完整原始碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using MySql.Data;
using System.Data;
using MySql.Data.MySqlClient;
namespace WcfService1
{
// 注意: 使用“重構”選單上的“重新命名”命令,可以同時更改程式碼、svc 和配置檔案中的類名“registerAndLogin”。
// 注意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 registerAndLogin.svc 或 registerAndLogin.svc.cs,然後開始除錯。
public class registerAndLogin : IregisterAndLogin
{
const string sqlconfig = "Server = localhost; Port= 3306;Uid=root;Pwd=123456;Database=cnn";
MySqlConnection conn = new MySqlConnection(sqlconfig);
public void opendataBase()
{
conn.Open();
}
public void closedataBase()
{
conn.Close();
}
public int register(string username, string password)
{
try
{
opendataBase();
string sql = "insert into user(username, password) values (@username, @password)";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlParameter parn = new MySqlParameter("@username", username);
cmd.Parameters.Add(parn);
MySqlParameter parp = new MySqlParameter("@password", password);
cmd.Parameters.Add(parp);
//result接受受影響的行數,也就是說大於0的話表示新增成功
int result = cmd.ExecuteNonQuery();
cmd.Dispose();
return result;
}
catch (Exception e)
{
throw e;
}
finally
{
closedataBase();
}
}
/// <summary>
/// @author cuiningning
/// @date 2018/09/13
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
public DataSet login(string username, string password)
{
try
{
opendataBase();
string sql = "select * from user where username ='" + username + "'";
MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
adapter.Fill(ds);
return ds;
}
catch (Exception e)
{
throw e;
return null;
}
finally
{
closedataBase();
}
}
}
}
2.IregisterAndLogin.cs
在介面檔案裡,宣告可供外部掉用的函式。其中標註為 [OperationContract] 的函式表明是可以供外部客戶端呼叫的函式。介面上的 [ServiceContract] 表明這個類是對外提供服務的類介面。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data;
namespace WcfService1
{
// 注意: 使用“重構”選單上的“重新命名”命令,可以同時更改程式碼和配置檔案中的介面名“IregisterAndLogin”。
[ServiceContract]
public interface IregisterAndLogin
{
[OperationContract]
int register(string username, string password);
[OperationContract]
DataSet login(string username, string password);
}
}
三、.啟動專案,檢視測試結果
在專案名稱下右擊,選擇 ”除錯“ -->"啟動 新例項",會自動呼叫瀏覽器,跳出一下介面,埠為自動分配的,在這個頁面上會看到本專案下編寫的所有服務。
找到剛才編寫的 registerAndLogin.svc, 點選進去,請注意一下下面這個網址,客戶端和伺服器的通訊,就是通過這個地址。在這個頁面的下面給出了,該服務C#的呼叫方法。
class Test
{
static void Main()
{
IregisterAndLoginClient client = new IregisterAndLoginClient();
// 使用 "client" 變數在服務上呼叫操作。
// 始終關閉客戶端。
client.Close();
}
}
此時伺服器端的相關操作可以告一段落。
三:使用winform建立客戶端進行測試
3.1 新建windows窗體 應用程式
3.2 在form1上分別新增,一個登入按鈕,一個註冊按鈕,一個使用者名稱的輸入框和一個密碼的輸入框’
3.3 將服務引入
在客戶端專案目錄下的 ”引用“ 下右擊 選擇新增”服務引用“,會出現以下介面,將剛才執行伺服器時記錄的地址複製到本頁面的位址列裡,給名稱空間起一個名字,然後點選”轉到“,這時服務便已引入,如該服務以後有程式碼有程式碼更新,在客戶端專案目錄下的 ”引用“ 下右擊 選擇新增”更新服務引用“即可。
3.4 給控制元件寫監聽事件
在客戶端呼叫服務建立服務介面的物件,通過例項化一個服務介面物件。
wcfService.IregisterAndLoginClient client = new wcfService.IregisterAndLoginClient();
其中 wcfService 是在上圖引入服務時,名稱空間的名稱,IregisterAndLoginClient是伺服器程式碼所編寫介面的客戶端類,然後呼叫對應的功能函式,比如 DataSet loginResult = client.login("cnn", "123456"); 和 int registerResult = client.register("test", "123456");
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace testForm
{
public partial class Form1 : Form
{
wcfService.IregisterAndLoginClient client = new wcfService.IregisterAndLoginClient();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
int registerResult = client.register(textBox1.Text, textBox2.Text);
TextBox mytext = new TextBox();
if (registerResult > 0)
{
mytext.Text = "註冊成功";
this.Controls.Add(mytext);
}
else
{
mytext.Text = "註冊失敗";
this.Controls.Add(mytext);
}
// 始終關閉客戶端。
client.Close();
}
private void button2_Click(object sender, EventArgs e)
{
DataSet loginResult = client.login(textBox1.Text, textBox2.Text);
TextBox mytext = new TextBox();
string result = "";
if (loginResult.Tables.Count > 0 && loginResult.Tables[0].Rows.Count > 0)
{
int PS_id = (int)loginResult.Tables[0].Rows[0][0];
string username = (string)loginResult.Tables[0].Rows[0][1];
string password = (string)loginResult.Tables[0].Rows[0][2];
result = username + "恭喜您登入成功";
mytext.Text = result;
this.Controls.Add(mytext);
}
else
{
result = "您登入失敗";
mytext.Text = result;
this.Controls.Add(mytext);
}
}
}
}
3.5 最後啟動客戶端,會出現以下介面,進行測試即可。
四:使用控制檯應用程式進行測試
4.1 新建控制檯應用程式
4.2 將服務引入
在客戶端專案目錄下的 ”引用“ 下右擊 選擇新增”服務引用“,會出現以下介面,將剛才執行伺服器時記錄的地址複製到本頁面的位址列裡,給名稱空間起一個名字,然後點選”轉到“,這時服務便已引入,如該服務以後有程式碼有程式碼更新,在客戶端專案目錄下的 ”引用“ 下右擊 選擇新增”更新服務引用“即可。
4.3 程式碼編寫
在客戶端呼叫服務建立服務介面的物件,通過例項化一個服務介面物件。
wcfService.IregisterAndLoginClient client = new wcfService.IregisterAndLoginClient();
其中 wcfService 是在上圖引入服務時,名稱空間的名稱,IregisterAndLoginClient是伺服器程式碼所編寫介面的客戶端類,然後呼叫對應的功能函式,比如 DataSet loginResult = client.login("cnn", "123456"); 和 int registerResult = client.register("test", "123456");
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
wcfservice.IregisterAndLoginClient client = new wcfservice.IregisterAndLoginClient();
int registerResult = client.register("test", "123456");
if(registerResult > 0)
{
Console.WriteLine("success");
}
Console.ReadLine();
DataSet loginResult = client.login("cnn", "123456");
if (loginResult.Tables.Count > 0 && loginResult.Tables[0].Rows.Count > 0)
{
int PS_id = (int)loginResult.Tables[0].Rows[0][0];
string username = (string)loginResult.Tables[0].Rows[0][1];
string password = (string)loginResult.Tables[0].Rows[0][2];
Console.Write(PS_id);
Console.Write(username);
Console.Write(password);
Console.Write(loginResult.GetXml());
}
// 始終關閉客戶端。
client.Close();
}
catch (Exception e)
{
throw;
}
}
}
}
4.4 啟動客戶端,進行測試
五:將伺服器程式部署至伺服器
1、本地操作:
右鍵單擊工程,單擊發布,在彈出的視窗中,單擊(預設)左側的配置檔案,單擊自定義,然後把專案中的配置檔案的名字輸進去,如圖:
然後選擇左側連線,釋出方法選擇檔案系統,目標位置選擇你喜歡的本地資料夾,到時候會發布在該資料夾下,如圖
然後單擊左側設定,選擇Relase,如圖:
然後單擊預覽,基本沒什麼操作,單擊發布。
然後去D:\site目錄下檢視釋出成功的檔案,這就是要釋出的檔案
2、IIS操作:
開啟IIs管理器:
然後開啟IIS管理器,單擊左側的應用程式池,點選後後,右側有個設定應用程式池預設設定,點開,然後設定為v4.0,如圖:
接著,右鍵單擊左側的“網站”,點選新增網站,彈出如下視窗:
網站名稱就是將要在左側顯示的,物理路徑就是你拷貝到伺服器的那個資料夾。IP請選擇你遠端訪問伺服器的那個IP,埠可根據需求指定,然後點選確定。然後在IIS管理器中,右鍵單擊剛才的網站,管理網站--瀏覽,出現如下介面就是OK了。
注意:要單擊測試設定,可能會出現如下提示:
為了驗證授權,關掉這個視窗,在上上上圖中,單擊連線為,在彈出的窗口裡選擇特定使用者,單擊設定。輸入你登入伺服器的賬號密碼即可:
之後驗證如圖:
然後關閉這個,就可以釋出了。
六:遇到的問題
(1)wcf伺服器突然啟動遭遇閃退,且不報錯。
因為伺服器前一天還是能夠正常執行的 ,今天一開機再使用,啟動時就開始閃退。在一些部落格上看到是因為沒有使用try/catch進行異常的捕捉,發生異常才導致閃退的,因為前一天程式還可以正常執行,所以首先排除是程式碼的問題。後來考慮到是不是埠(本程式隨機分配的埠是60295)被佔用了。然後就查看了埠的使用情況,果然是這個60295埠被佔用了。然後找到對應的程序,將該程序結束。再重新啟動,果然就OK了。
參考文章:
第三小節資料庫關於資料庫增刪改查參考文章
第五小節參考文章
第五小節擴充套件文章