1. 程式人生 > >WinForm+WCF+mysql+http實現簡單的使用者登入註冊

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下載後,選一個位置存放,然後在專案名稱下的 “引用“上右擊選擇“新增引用”,即可進入如下介面,選擇瀏覽,將其上傳。引用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中的具體實現。

  1. 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了。

參考文章:

第三小節資料庫關於資料庫增刪改查參考文章

第五小節參考文章

第五小節擴充套件文章