前言
一般在 dotnet core 下构建使用 web 服务应用都使用 ASP.NET core, 但通过 FastHttpApi 组建也可以方便地构建 Web 服务应用, 在 FastHttpApi 功能的支持下构建多人聊天室是件非常简单的事情, 通过组件并不需要了解 WebSocket 知识即可简单构建, 以下讲解一下通过 FastHttpApi 如何构建一个简单的多人聊室.
创建项目
使用 FastHttpApi 构建一个 Web 服务只需要创建一个普通 ConsoleApp( 控制台应用)
创建项目后需要在 Nuget 中添加引用 FastHttpApi
只需要简单地引用 Beetlex.FastHttpApi 即可构建基于 Http 和 Websocket 通讯应用.
创建逻辑
FastHttpApi 对类和方法没有太多规则约束, 只需要在类上定义一个 Controller 标签即可, 接下来实现一个简单的 Web 聊天室
- [Controller]
- public class Controller
- {
- // 用户登陆
- public bool Login(string nickName, IHttpContext context)
- {
- context.Session.Name = nickName;
- ActionResult result = new ActionResult();
- result.Data = new { name = nickName, message = "login", type = "login", time = DateTime.Now.ToString("T") };
- context.SendToWebSocket(result);
- return true;
- }
- // 获取在线用户
- public object ListOnlines(IHttpContext context)
- {
- return from r in context.Server.GetWebSockets()
- where r.Session.Name != null
- select new { r.Session.Name, IP = r.Session.RemoteEndPoint.ToString() };
- }
- // 发送聊天信息
- public bool Talk(string nickName, string message, IHttpContext context)
- {
- ActionResult result = new ActionResult();
- result.Data = new { name = nickName, message, type = "talk", time = DateTime.Now.ToString("T") };
- context.SendToWebSocket(result);
- return true;
- }
- }
以上代码分别定义登陆, 获取在线用户和 alk 方法, 方法的定义同样也是没有约束性, 对于 IHttpContext 这些参数都是根据自己需要定义, 如果不需要则不用在方法中定义它. 接下来的事情就是要在页面上调用它, 大家知道在页面调用 http 或 websocket 需要定义一些代码和指定相应的 URL. 但 Beetlex.FastHttpApi 提供一个非常便利的方式, 通过安装一个插件可以自动生成这些代码插件安装介绍 (暂只支持 vs2017). 当插件安装完成后只需要设置类文件的自定义工具即可
插件会在当前类文下生成一个 JS 文件, 文件里把调用方法的 URL 和参数都定义完成
- var $Login$url='/login';
- function $Login(nickName,useHttp)
- {
- return API($Login$url,{nickName:nickName},useHttp).sync();
- }
- function $Login$async(nickName,useHttp)
- {
- return API($Login$url,{nickName:nickName},useHttp);
- }
- var $ListOnlines$url='/listonlines';
- function $ListOnlines(useHttp)
- {
- return API($ListOnlines$url,{},useHttp).sync();
- }
- function $ListOnlines$async(useHttp)
- {
- return API($ListOnlines$url,{},useHttp);
- }
- var $Talk$url='/talk';
- function $Talk(nickName,message,useHttp)
- {
- return API($Talk$url,{nickName:nickName,message:message},useHttp).sync();
- }
- function $Talk$async(nickName,message,useHttp)
- {
- return API($Talk$url,{nickName:nickName,message:message},useHttp);
- }
这个文件非常简单, 主要包括 URL, 同步方法和异步方法. 这个 JS 文件需要依赖才能使用, 所以在页面上必须把这个文件也引用上. 接下来就是页面脚本的使用
- <script>
- function receive(result) {
- if (result.Data.type == 'login' || result.Data.type == 'quit') {
- $ListOnlines$async().execute(function (result) {
- listUserControl.Data = result.Data;
- });
- }
- messages.push(result.Data);
- var objDiv = document.getElementById("lstTalk");
- objDiv.scrollTop = objDiv.scrollHeight;
- }
- async function sendMessage() {
- var msg = $('#talkMsg').val();
- if (!msg) {
- alert("enter message");
- return;
- }
- var result = await $Talk(nickName, msg);
- if (result.Code != 200)
- alert(result.Error);
- else
- $('#talkMsg').val('');
- }
- async function login() {
- nickName = $('#userName').val();
- if (!nickName) {
- alert("enter you name!")
- return;
- }
- var result = await $Login(nickName);
- if (result.Code == 200) {
- $('#loginBar').hide();
- $('#talkBar').show();
- }
- else {
- alert(result.Error);
- }
- }
- </script>
引用脚本后, 直接通过方法调用即可, 这种明确的方法调用比传统的 jQuery.post 有着调用的明确性和便利性, 让使用者不需要查看接口文档即可以知道方法的调用参数. 如果控制器定了 xml 帮助注释, 插件同样也会把注释生成到脚本中.
静态文件存储
组件通过固定的目录来存放静太资源, 因此项目需要创建一个 views 目录来存储静态资源, views 目录是 Web 服务的根目录.
由于静态文件默认情况是不会被编译处理, 所以我们需要把文件设置成编译嵌入模式或复制到输出目录中. 如果是复制到输出目录下, 可以在项目生成事件中添加一段.
启动服务
组件启动服务很简单, 不过在启动前需要注册一下程序集, 把控制器注册到 HTTP 服务中.
- static void Main(string[] args)
- {
- mApiServer = new BeetleX.FastHttpApi.HttpApiServer();
- mApiServer.Debug();// 只有在 Debug 模式下生产, 把静态资源加载目录指向项目的 views 目录
- mApiServer.Register(typeof(Program).Assembly);// 加载程序集中所有控制器信息和静态资源信息
- mApiServer.Open();
- Console.Write(mApiServer.BaseServer);
- Console.Read();
- }
组件默认是不需要配置即可启动 HTTP 服务, 默认端口是 9090. 不过这些信息也是可以通过配置文件加载, 只要程序目录存在 HttpConfig.JSON 文件组件即会加载配置文件中的配置信息来运行服务.
服务配置文件
组件提供 HttpConfig.JSON 作为组件基础服务项设置, 这个文件不是必须, 只要目录下存在这个文件组件就会在初始化服务的时候加载这个文件的信息作为设置信息. 以下大概的讲解一下这个配置文件的配置项.
- {
- "HttpConfig": {
- "Host": "",
- "Port": 9090,
- "SSL": false,
- "CertificateFile": "",
- "CertificatePassword": "",
- "MaxBodyLength": 2097152,
- "OutputStackTrace": false,
- "StaticResurceType": "xml;svg;woff;woff2;jpg;jpeg;gif;png;js;html;htm;CSS;txt;ico;zip;rar",
- "DefaultPage": "index.html;index.htm",
- "NotLoadFolder": "\\Files;\\Images;\\Data",
- "Manager": "admin",
- "ManagerPWD": "123456",
- "NoGzipFiles": "jpg;jpeg;png;gif;png;ico;zip;rar;bmp",
- "CacheFiles": "html;htm;js;css",
- "BufferSize": 1024,
- "WebSocketMaxRPS": 1000,
- "WriteLog": true,
- "LogToConsole": true,
- "LogLevel": "Warring",
- "FileManager": false
- }
- }
- Host
服务监听的 IP 地址, 暂只支持 any 或一个 ip
Port
服务监听的端口
SSL
是否开启 SSL 功能, 如果需要开启必须指定证书和加载证书的密码; 启动后即可对服务进行 Https 访问
CertificateFile
证书文件
CertificatePassword
证书密码
MaxBodyLength
Http 体最大消息长度, 默认是 2M
OutputStackTrace
当服务错误的时候是否输出详细错误代码信息
StaticResurceType
支持的静态资源类型, 如果这里没有描述的文件类型访问会返回 403
DefaultPage
访问根路径的情况, 默认寻找的文件
Manager
后台管理员的用户名
ManagerPWD
后台管理员的密码
WriteLog
是否打开日志写文件
LogLevel
输出日志级别, 主要有以下几种级别: Debug,None,Info,Warring,Error
这样一个简单多人 Web 聊天室就完成, 运行效果如下:
在线演示
详细代码
总结
以上就是这篇文章的全部内容了, 希望本文的内容对大家的学习或者工作具有一定的参考学习价值, 如果有疑问大家可以留言交流, 谢谢大家对脚本之家的支持.
来源: https://www.jb51.net/article/149243.htm