目录
直入主题
一、创建项目
在之前服务端的解决方案中新增一个WinForm项目 WinLogin
二、安装Package
使用Nuget安装以下Package
Microsoft.AspNet.SignalR.Client
以上包有依赖项(贴心的Nuget帮咱把Json都引用好了),需要全部引入,引用完成后的packages.config文件如下:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.SignalR.Client" version="2.4.1" targetFramework="net452" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
</packages>
三、完成登录界面
3.1创建登陆界面
在项目中新增一个WinForm页面 Login.cs
拖两个label两个textbox控件进来,长这个样子
来写后台代码,如果你看过Web版客户端实现的方法,这里也差不多。但是WinForm控件赋值时有个跨线程安全的验证。我没能很好的解决,如果您有更好的办法,请在评论区告诉我,谢谢!
那就直接贴代码了:
using Microsoft.AspNet.SignalR.Client;
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 WinLogin
{
public partial class Login : Form
{
HubConnection connection;
IHubProxy hub;
string url = "http://localhost:9999";
//Safe
//private delegate void SafeCallDelegate(TextBox textBoxControl, string text);
public Login()
{
InitializeComponent();
}
private void Login_Load(object sender, EventArgs e)
{
//控件跨线程安全验证设置为false,不然无法对控件进行赋值。
//微软官方说明 https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?f1url=%3FappId%3DDev14IDEF1%26l%3DZH-CN%26k%3Dk(EHInvalidOperation.WinForms.IllegalCrossThreadCall);k(TargetFrameworkMoniker-.NETFramework,Version%253Dv4.5.2);k(DevLang-csharp)%26rd%3Dtrue&view=netframeworkdesktop-4.8
//我尝试用安全的方式去对控件进行赋值,但是失败了。所有注释为Safe的代码都是微软建议的写法,但是没有成功
//如果您有更好的方式,请在评论区告诉我,谢谢!
Control.CheckForIllegalCrossThreadCalls = false;
connection = new HubConnection(url);
//类名必须与服务端一致
hub = connection.CreateHubProxy("MyHub");
//方法名必须与服务端一致
hub.On<string>("GetUUID", getUUID);
hub.On<string>("GetUserInfo", getUserInfo);
connection.Start().Wait();
hub.Invoke("Register").Wait();
}
private void getUUID(string message)
{
this.txtUUID.Text = message;
//Safe
//WriteTextSafe(txtUUID, message);
}
private void getUserInfo(string message)
{
this.txtUserInfo.Text = message;
//Safe
//WriteTextSafe(txtUserInfo, message);
}
//Safe
//private void WriteTextSafe(TextBox textBoxControl, string text)
//{
// if (textBoxControl.InvokeRequired)
// {
// var d = new SafeCallDelegate(WriteTextSafe);
// textBoxControl.Invoke(d, new object[] { text });
// }
// else
// {
// textBoxControl.Text = text;
// }
//}
}
}
这样就可以了!
3.2验证结果
因为我们把代码写在了同一个解决方案中,就没法同时调试了。
我们进入服务端项目的生成目录中ScanQRCodeToLogin\SignalRService\bin\Debug 直接启动SignalRService.exe
然后将 WinLogin设置为启动项目
启动项目 进入LoginForm,进入后注册成功,获取到UUID
这时我们新开Web窗口,调用服务端扫码登陆的API模拟扫码登陆成功
可以看到我们登陆成功的同时,客户端收到了用户的登陆信息
好的,鼓掌,我们C/S版的扫码登陆就完成了
如果你想把它应用到你的项目中,你还需要把UUID在客户组转变成一个真正的二维码,用APP去读取二维码中的UUID,然后去调用 服务端登陆成功的接口
四、相关文章
[C#]SignalR实现扫码登录(B/S,C/S)(一)——服务端搭建
[C#]SignalR实现扫码登录(B/S,C/S)(二)——客户端搭建(Web版)