.NET WebService \ WCF \ WebAPI 部署总结 以及 window 服务 调试,webservice 的安全验证
一、webservice 部署只能部署IIS上,
比较简单,就不做说明了
安全验证:
- Form
- window身份
- 加个参数,token 定时更新
- 可以Soapheader

》》》soapheader验证
首先要新建一个类
且这个类必须继承SoapHeader类
且这个类型必须有一个无参的构造函数
public class CustomSoapHeader:System.Web.Services.Protocols.SoapHeader{public string UserName{ get; set; }public string PassWord{ get; set; }// 必须有一个无参的构造函数public CustomSoapHeader(){}public CustomSoapHeader( string userName,string passWord){this.UserName=userName;this.PassWord=passWord;}public bool Validate(){// 要从数据库取数 判断的 if(this.UserName = xxx && this.PassWord == xxxx)return true;else{}}}
然后再 webService中
public CustomSoapHeader custheader;//在需要的方法上添加SoapHeader 特性[WebMethod][SoapHeader("custheader")]public bool UserLoad(){if(custheader.Validate()){if (header.Name == "admin" && header.Pwd == "123"){return true;}else{return false;}}else {throw new SoapException("身份验证失败",SoapHeaderException.ServerFault.Code)}}
要调用这个web Service中的UserLoad 方法,需要传递 CustomSoapHeader 对象参数
二、 WCF 部署 1


》》》》 wcf 配置信息
<?xml version="1.0" encoding="utf-8"?><configuration><system.serviceModel><!--配置服务和终结点开始--><services><service><endpoint></endpoint></service></services><!--配置服务和终结点结束--><!--配置绑定开始--><bindings><netTcpBinding><binding></binding></netTcpBinding></bindings><!--配置绑定结束--><!--配置行为开始--><behaviors><serviceBehaviors><behavior></behavior></serviceBehaviors></behaviors><!--配置行为结束--></system.serviceModel></configuration>

<system.serviceModel><!--服务--><services><!--name:名称空间.类型名--><!--behaviorConfiguration:behavior的名称,请看behavior配置节的名称--><service name="WCFLibrary.User" behaviorConfiguration="MyBehavior"><host><baseAddresses><!-- 每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地址组成完整的地址,每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service对外发布服务说明页面的URL --><add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFLibrary/Service/"/></baseAddresses></host><!-- 除非完全限定,否则地址将与上面提供的基址相关,每个服务可以有多个Endpoint --><!-- Address:指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress--><!--bindingConfiguration:binding的名称,请看binding配置节的名称--><endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser" bindingConfiguration="myHttpBinding"><identity><dns value="localhost"/></identity></endpoint><!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除--><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/></service></services><!--绑定--><bindings><wsHttpBinding><binding name="myHttpBinding"><security mode="None"><message clientCredentialType="Windows" /></security></binding></wsHttpBinding></bindings><!--行为--><behaviors><serviceBehaviors><behavior name="MyBehavior"><!-- httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据 --><serviceMetadata httpGetEnabled="True"/></behavior></serviceBehaviors></behaviors></system.serviceModel>
using System.ServiceModel; //服务契约
using System.Runtime.Serialization; //数据契约
》》》 服务契约
[ServiceContract]public interface ISayHi{[OperationContract]string ToSayHi();/// <summary>/// 自我介绍/// </summary>/// <param name="person">个人信息</param>/// <returns>返回个人介绍</returns>[OperationContract]string Introduce(Person person);}
》》》》 数据契约
[DataContract]public class Person{[DataMember(Name="ShortName")] //定义别名public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public string Country { get; set; }public string Introduce(){return string.Format("Hello,my name is {0}.I am {1} years old.I am from {2}.", Name, Age, Country);}}
注意DataMember属性,可以控制字段的可见性。默认是都可见,如果DataMember属性在类中出现,则没有添加该属性的字段不可见。
部署到IIS 跟部署 webservice 部署方法一样的
wcf 部署2
部署到控制台 要以管理员运行vs,或者 管理员运行 控制台的exe
在控制器项目中
创建IUserInfoService 接口
》》》Abort( ) 方法不会抛出异常, 而 Close( )方法则可能抛出 TimeoutException 和 CommunicationException。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp1
{[ServiceContract]public interface IUserInfoService{[OperationContract]int Add(int a, int b);}
}

实现接口

在app.config中增加

<system.serviceModel><services><service name="ConsoleApp1.UserInfoService" behaviorConfiguration="behaviorConfiguration"><!--服务的对象--><host><baseAddresses><add baseAddress="http://localhost:8000/"/><!--服务的IP和端口号--></baseAddresses></host><endpoint address="" binding="basicHttpBinding" contract="ConsoleApp1.IUserInfoService"></endpoint><!--contract:服务契约--></service></services><behaviors><serviceBehaviors><behavior name="behaviorConfiguration"><!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 --><serviceMetadata httpGetEnabled="true"/><!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --><serviceDebug includeExceptionDetailInFaults="true"/></behavior></serviceBehaviors></behaviors></system.serviceModel>
《《《启动服务


》》》验证是否有效

》》》如果不放在配置文件中

》》》
using (ServiceHost host = new ServiceHost(typeof(UserInfoService))){向宿主中添加终结点host.AddServiceEndpoint(typeof(IUserInfoService), new WSHttpBinding(), "http://localhost:8686/userinfoservice");if (Host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null){ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();behavior.HttpGetEnabled = true;behavior.HttpGetUrl = new Uri("http://localhost:8686/userinfoservice/metadata");host.Description.Behaviors.Add(behavior);host.Opened +=delegate{ Console.WriteLine("服务已启动");};host.Open(); Console.ReadKey();host.Close();}}
或者
//创建宿主的基地址Uri baseAddress = new Uri("http://localhost:8080/User");//创建宿主using (ServiceHost host = new ServiceHost(typeof(User), baseAddress)){//向宿主中添加终结点host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");//将HttpGetEnabled属性设置为trueServiceMetadataBehavior smb = new ServiceMetadataBehavior();smb.HttpGetEnabled = true;//将行为添加到Behaviors中host.Description.Behaviors.Add(smb);//打开宿主host.Open();Console.WriteLine("WCF中的HTTP监听已启动....");Console.ReadLine();host.Close();}
》》》 校验是否成功


部署到winform

private void button1_Click(object sender, EventArgs e){ServiceHost Host = new ServiceHost(typeof(WCF.Student));//绑定System.ServiceModel.Channels.Binding httpBinding = new BasicHttpBinding();//终结点Host.AddServiceEndpoint(typeof(IWCF.IStudent), httpBinding, "http://localhost:8002/");if (Host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null){//行为ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();behavior.HttpGetEnabled = true;//元数据地址behavior.HttpGetUrl = new Uri("http://localhost:8002");Host.Description.Behaviors.Add(behavior);//启动Host.Open();}}
》》》验证

app.config 配置
<service name="WCF.Student" behaviorConfiguration="behaviorConfiguration"><!--//服务的对象--><host><baseAddresses><add baseAddress="http://localhost:5678"/><!--// 服务的IP和端口号--></baseAddresses></host><endpoint address="" binding="wsHttpBinding" contract="IWCF.IStudent"></endpoint><!--//contract:服务契约--></service></services><behaviors><serviceBehaviors><behavior name="behaviorConfiguration"><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="False"/></behavior></serviceBehaviors></behaviors></system.serviceModel>

》》》》验证

WCF 宿主 服务中


》》》 app.config 或者写作code 都行



LocalService:充当本地计算机上非特权用户的帐户,该帐户将匿名凭据提供给所有远程服务器。
NetworkService:提供广泛的本地特权的帐户,该帐户将计算机的凭据提供给所有远程服务器。
LocalSystem:服务控制管理员使用的帐户,它具有本地计算机上的许多权限并作为网络上的计算机。
User:由网络上特定的用户定义的帐户。如果为 ServiceProcessInstaller.Account 成员指定 User,则会使系统在安装服务时提示输入有效的用户名和密码,除非您为 ServiceProcessInstaller 实例的 Username 和 Password 这两个属性设置值。




删除服务
sc delete 服务名称


window 服务调试
正常是无法调试的,可以在window服务中做调整
如下






<connectionStrings><!--服务开启时间--><add name="ServiceStart" connectionString="9:00"/><!--服务执行间隔(秒)--><add name="ServiceInterval" connectionString="60"/><!--服务停止时间--><add name="ServiceEnd" connectionString="17:00"/><!--服务是否开启(1开启、0关闭)--><add name="ServiceIsOn" connectionString="0"/></connectionStrings>

public partial class Service1 : ServiceBase{//服务配置项private static string ServiceStart = ConfigurationManager.ConnectionStrings["ServiceStart"].ConnectionString;private static int ServiceInterval = Convert.ToInt32(ConfigurationManager.ConnectionStrings["ServiceInterval"].ConnectionString);private static string ServiceEnd = ConfigurationManager.ConnectionStrings["ServiceEnd"].ConnectionString;private static string ServiceIsOn = ConfigurationManager.ConnectionStrings["ServiceIsOn"].ConnectionString;//服务定时器private System.Timers.Timer timer = new System.Timers.Timer();public Service1(){InitializeComponent();}/// <summary>/// 开启服务/// </summary>/// <param name="args"></param>protected override void OnStart(string[] args){if (ServiceIsOn == "1"){timer.Enabled = true;timer.Interval = ServiceInterval * 1000;//执行间隔时间,单位为毫秒; 这里实际间隔为1秒钟 timer.Start();timer.Elapsed += new System.Timers.ElapsedEventHandler(Procedure_Timer);Procedure_Timer(null, null);}}/// <summary>/// 定时器执行/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Procedure_Timer(object sender, System.Timers.ElapsedEventArgs e){timer.Enabled = false;TestClass service = new TestClass();DateTime newDate = DateTime.Now;//获取当前时间int intHour = newDate.Hour;int intMinute = newDate.Minute;//开始时间string[] startStamp = ServiceStart.Split(':');int startHour = Convert.ToInt32(startStamp[0]);int startMinute = Convert.ToInt32(startStamp[1]);//结束时间string[] endStamp = ServiceEnd.Split(':');int endHour = Convert.ToInt32(endStamp[0]);int endMinute = Convert.ToInt32(endStamp[1]);int newTime = (intHour * 100) + intMinute;int startTime = (startHour * 100) + startMinute;int endTime = (endHour * 100) + endMinute;// 每天定点在一个时间段内执行if (newTime >= startTime && newTime <= endTime){//执行业务代码//}timer.Enabled = true;}/// <summary>/// 关闭服务/// </summary>protected override void OnStop(){timer.Stop();}}
》》》wcf 宿主到 服务中 调试方法

window 服务 卸载
》》》1 在cmd中 录入 sc delete 服务名称 注意注意 是服务名称 不是显示名称
这种方法 不需要 停车服务,可以直接干掉
》》》2、 代码实现
卸载前,一定要停止掉Windows服务,否则需要重启或注销电脑。代码无法停止服务时,使用services.msc来停止。
获取系统所有window 服务
ServiceController[] services = ServiceController.GetServices();
》》》》“Service1.cs”的代码,增加服务启动日志和停止日志。
using CommonUtils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;namespace ADemoWinSvc
{public partial class Service1 : ServiceBase{public Service1(){InitializeComponent();}protected override void OnStart(string[] args){GLog.WLog("服务已启动");}protected override void OnStop(){GLog.WLog("服务已停止");}}
}
》》》》 工具类
using System;
using System.IO;namespace CommonUtils
{public static class GLog{static object _lockObj = new object();public static void WLog(string content){lock (_lockObj){string curPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);string logDir = "Logs";string logDirFullName = Path.Combine(curPath, logDir);try{if (!Directory.Exists(logDirFullName))Directory.CreateDirectory(logDirFullName);}catch { return; }string fileName = "Logs" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";string logFullName = Path.Combine(logDirFullName, fileName);try{using (FileStream fs = new FileStream(logFullName, FileMode.Append, FileAccess.Write))using (StreamWriter sw = new StreamWriter(fs))sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " " + content);}catch { return; }}}}
}
========= 上面代码都是 服务中的
下面代码 是winForm程序中的==

using CommonUtils;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace Windows服务操作
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}/// <summary>/// windows服务名/// </summary>static string _winSvcName = "ADemoWinSvc";/// <summary>/// windows服务对应的exe 名/// </summary>static string _winSvcExeName = "ADemoWinSvc.exe";private void btnSetup_Click(object sender, EventArgs e){try{//是否存在服务if (ServiceUtil.ServiceIsExisted(_winSvcName)){//已存在,检查是否启动if (ServiceUtil.IsRun(_winSvcName)){//服务是已启动状态lblMsg.Text = "[001]服务是已启动状态";}else{//未启动,则启动ServiceUtil.StarService(_winSvcName);lblMsg.Text = "[002]服务是已启动状态";}}else{//不存在,则安装IDictionary mySavedState = new Hashtable();string curPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName);string apppath = Path.Combine(curPath, _winSvcExeName);ServiceUtil.InstallService(mySavedState, apppath);lblMsg.Text = "[003]服务是已启动状态";//安装后并不会自动启动。需要启动这个服务ServiceUtil.StarService(_winSvcName);lblMsg.Text = "[004]服务是已启动状态";}}catch (Exception ex){MessageBox.Show(ex.Message);}}private void btnUninstall_Click(object sender, EventArgs e){//** 卸载服务最重要的是先停止,否则电脑需要重启或注销 **try{//是否存在服务if (!ServiceUtil.ServiceIsExisted(_winSvcName)){MessageBox.Show("服务不存在,不需要卸载");return;}//如果服务正在运行,停止它if (ServiceUtil.IsRun(_winSvcName)){ServiceUtil.StopService(_winSvcName);}//再检查一次是否在运行if (ServiceUtil.IsRun(_winSvcName)){MessageBox.Show("服务无法停止,请手动停止这个服务");return;}//卸载ServiceUtil.UnInstallServiceByName(_winSvcName);lblMsg.Text = "[005]服务已卸载";}catch (Exception ex){MessageBox.Show(ex.Message);}}}
}
》》》》》
AssemblyInstaller 帮助文件
https://learn.microsoft.com/zh-cn/dotnet/api/system.configuration.install.assemblyinstaller?view=netframework-4.8.1
》》》》 工具类
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;namespace CommonUtils
{/// <summary>/// windows服务操作工具类/// </summary>public static class ServiceUtil{/// <summary>/// 服务是否正在运行/// </summary>/// <param name="name"></param>/// <returns></returns>public static bool IsRun(string name){bool IsRun = false;try{if (!ServiceIsExisted(name)) return false;var sc = new ServiceController(name);if (sc.Status == ServiceControllerStatus.StartPending || sc.Status == ServiceControllerStatus.Running){IsRun = true;}sc.Close();}catch{IsRun = false;}return IsRun;}/// <summary>/// 启动服务/// </summary>/// <param name="name"></param>/// <returns></returns>public static bool StarService(string name){try{var sc = new ServiceController(name);if (sc.Status == ServiceControllerStatus.Stopped || sc.Status == ServiceControllerStatus.StopPending){sc.Start();sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10));}else{}sc.Close();return true;}catch (Exception ex){throw ex;}}/// <summary>/// 停止服务(有可能超时)/// </summary>/// <param name="name"></param>/// <returns></returns>public static bool StopService(string name){try{var sc = new ServiceController(name);if (sc.Status == ServiceControllerStatus.Running || sc.Status == ServiceControllerStatus.StartPending){sc.Stop();//停止服务超时时间:56秒。sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 56));}else{}sc.Close();return true;}catch (Exception ex){throw ex;}}/// <summary>/// 是否存在/// </summary>/// <param name="serviceName"></param>/// <returns></returns>public static bool ServiceIsExisted(string serviceName){ServiceController[] services = ServiceController.GetServices();foreach (ServiceController s in services)if (s.ServiceName.ToLower() == serviceName.ToLower())return true;return false;}/// <summary>/// 安装/// </summary>/// <param name="stateSaver"></param>/// <param name="filepath"></param>public static void InstallService(IDictionary stateSaver, string filepath){try{AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();myAssemblyInstaller.UseNewContext = true;myAssemblyInstaller.Path = filepath;myAssemblyInstaller.Install(stateSaver);myAssemblyInstaller.Commit(stateSaver);myAssemblyInstaller.Dispose();}catch (Exception ex){throw ex;}}/// <summary>/// 使用路径卸载(有时候不便于用路径来卸载,则使用SC DELETE 名称来卸载)/// </summary>/// <param name="filepath"></param>public static void UnInstallService(string filepath){try{AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();myAssemblyInstaller.UseNewContext = true;myAssemblyInstaller.Path = filepath;myAssemblyInstaller.Uninstall(null);myAssemblyInstaller.Dispose();}catch (Exception ex){throw ex;}}/// <summary>/// 使用windows服务名卸载/// </summary>/// <param name="WinServiceName"></param>public static void UnInstallServiceByName(string WinServiceName){ProcessStartInfo pStart = new ProcessStartInfo("sc.exe");Process pRoc = new Process();pStart.Arguments = " delete " + WinServiceName;pStart.UseShellExecute = false;pStart.CreateNoWindow = false;pRoc.StartInfo = pStart;pRoc.Start();pRoc.WaitForExit();}}
}
wcf 服务 部署之后,测试


》》》或者通过SvcUtil.exe 生成代理类
会生成 两个文件
》xxxx.cs 类
》 xxx.config
将 xxx.config 中的内容copy到 程序目录下 App.config
同时将这个xxx.cs 类添加到 项目中
添加引用 System.Runtime.Serialization、System.ServiceModel ;
这个项目就可以使用wcf的服务啦
WebAPI 部署
部署 IIS
跟wcf 、webservice 一样。
部署 控制台
安装



static void Main(string[] args){RegisterWebApi("http://localhost:4554");}private static void RegisterWebApi(string url){var config = new HttpSelfHostConfiguration(url);config.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}",new { id = RouteParameter.Optional });using (HttpSelfHostServer server = new HttpSelfHostServer(config)){server.OpenAsync().Wait();Console.WriteLine("Press Enter to quit.");Console.ReadLine();}}

webapi 路由 一般没有 action 符合 RESETFUL 风格

》》》》》 部署到 winForm
安装如下:


添加控制器》》》




window 服务 也一样的
上面都说 selfhost
下面介绍》》》》 OwinSelfHost
OwinSelfHost
安装
注意注意 注意
是 Microsoft.AspNet.WebApi.oWinSelfHost

》》》添加Owin启动类

》》创建好 Owin Startup 如下
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888HttpConfiguration config = new HttpConfiguration();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{Controller}/{action}/{id}",defaults: new{id = RouteParameter.Optional});app.UseWebApi(config);

》》》》 新建控制器

》》》在Program中写入如下代码

static void Main(string[] args){string baseAddress = "http://localhost:9527/";using (WebApp.Start(url: baseAddress)){Console.WriteLine("请开始您的表演");Console.ReadLine();}}
》》》 验证

webapi 部署到 window 服务
首先 新建 window服务程序

步骤跟上面一样的
至少 服务启动 要 OnStart

》》》》安装 服务


》》》 window Form 部署方法一样
相关文章:
.NET WebService \ WCF \ WebAPI 部署总结 以及 window 服务 调试,webservice 的安全验证
一、webservice 部署只能部署IIS上, 比较简单,就不做说明了 安全验证: Formwindow身份加个参数,token 定时更新可以Soapheader 》》》soapheader验证 首先要新建一个类 且这个类必须继承SoapHeader类 且这个类型必须有一个无参…...
自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】
目录 一、inventory 主机清单 1.1inventory 中的变量 1.1.1主机变量 1.1.2组变量 1.1.3组嵌套 二、Ansible 的脚本 ------ playbook(剧本) 2.1 playbook介绍 2.2playbook格式 2.3playbooks 的组成 2.4playbook编写 2.5运行playbook 2.5.1ans…...
java static 关键字
在Java中,static是一个关键字,用于创建类级别的成员(字段、方法、块)。static成员属于类本身,而不是类的实例,因此可以直接通过类名访问,而不需要创建类的实例。 1. 静态字段(Stati…...
CentOS 磁盘扩容与创建分区
文章目录 未分配空间创建新分区重启服务器添加物理卷扩展逻辑卷 操作前确认已给服务器增加硬盘或虚拟机已修改硬盘大小(必须重启服务才会生效)。 未分配空间 示例说明:原服务器只有40G,修改虚拟机硬盘大小再增加20G后硬盘变为60G。…...
Java面试八股之什么是Java反射
什么是Java反射 基本概念 反射是Java语言的一个重要特性,它允许我们在运行时分析类、接口、字段、方法等组件的信息,并能够动态地操作这些组件,包括创建对象、调用方法、访问和修改字段值等。简单来说,反射提供了在程序运行时对…...
Netty-面试题(上)(四十九)
为什么Netty适合做网络编程? Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 主要用来做网络通信,一般可以用来作RPC框架的通信工具、实现即时通讯…...
【热门话题】Vue.js:现代前端开发的轻量级框架之旅
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 Vue.js:现代前端开发的轻量级框架之旅一、Vue.js概览1.1 Vue.js的诞…...
【LAMMPS学习】八、基础知识(6.5)PyLammps 教程
8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...
GPT-4o正式发布;零一万物发布千亿参数模型;英国推出AI评估平台
OpenAI 正式发布 GPT-4o 今天凌晨,OpenAI 正式发布 GPT-4o,其中的「o」代表「omni」(即全面、全能的意思),这个模型同时具备文本、图片、视频和语音方面的能力,甚至就是 GPT-5 的一个未完成版。 并且&…...
多模态大语言模型的演化:综述
24年2月意大利三所研究大学和机构的论文“The Evolution of Multimodal Large Language Models: A Survey”。 连接文本和视觉模态在生成智能中起着至关重要的作用。由于这个原因,在大语言模型成功的启发下,大量的研究工作被投入到多模态大语言模型&…...
Qt---绘图和绘图设备
一、QPainter绘图 绘图事件 void paintEvent() 声明一个画家对象,OPainter painter(this) this指定绘图设备 画线、画圆、画矩形、画文字 设置画笔QPen 设置画笔宽度、风格 设置画刷QBrush 设置画刷风格 代码示例: #includ…...
【2024】前端,该卷什么呢?
✅顺便推个机会,技术大厂,部门捞人,前后端可投。 2024ChatGPT 的炸裂式发展,很多大佬都亲自入场整活儿,你不得不说,人工智能时代的未来已来,大势所趋,不可阻挡。随着生成式AI的迅猛发…...
C++干货--引用
前言: C的引用,是学习C的重点之一,它与指针的作用有重叠的部分,但是它绝不是完全取代指针(后面我们也会简单的分析)。 引用的概念: 引用 不是新定义一个变量 ,而 是给已存在变量取了一个别名 …...
部署 Sentinel 控制台:实现流量管理和监控
序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台,它可以帮助开发者有效地管理微服务的流量,实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台,实现微服务的流量防护和监控。 一、Sen…...
10、Go Gin 连接Redis以及CookieSession
一、Redis 在Go语言中,使用Gin框架结合Redis数据库可以构建高性能的Web应用程序。Gin是一个轻量级的HTTP框架,提供了快速构建RESTful API的能力;而Redis则是一个高性能的键值存储系统,常用于缓存、消息队列、计数器等多种场景 1、…...
Electron-Vue 脚手架避坑实录,兼容Win11,升级electron22,清理控制台错误
去年的还是有用的,大家继续看,今年再补充一些Electron-Vue 异常处理方案 M1 和 Window10_electron异常处理-CSDN博客 代码gitee.com地址 electron-demo: electron 22 初始代码开发和讲解 升级electron为22版本(这个版本承上启下,…...
国外新闻媒体推广:多元化媒体分发投放-大舍传媒
前言 :随着全球化的进程,国外新闻市场呈现出快速发展的趋势。在这个趋势下,国外新闻媒体推广成为了各行业企业宣传业务的重要一环。本文将重点介绍大舍传媒的多元化媒体分发投放服务,以及对国外新闻媒体推广的意义。 1. 多元化媒…...
【Windows】回忆Win98
回忆Win98,又看到了这个Excel界面,上次还是十多年前的计算机课上 1、安装环境 Win11家庭版,23H2,VMware Workstation Pro 16 , 2、安装步骤及参考 虚拟机里的硬盘设置成SATA(否则各种错误),安装MSDOS7.1ÿ…...
探索QChart:Qt中的数据可视化艺术
目录标题 1. QChart概述2. 创建QChart对象3. 添加数据系列(Series)4. 定制图表外观5. 交互与动画6. 图表布局与管理7. 实例代码与解析8. 总结 在数字化的世界里,数据是新的石油。然而,原始数据本身往往难以理解,数据可…...
【Linux】线程机制解析:理解、优势与Linux系统应用
文章目录 前言:1. 线程概念1.1. 什么是线程1.2. 线程得优点:1.3. 线程的缺点线程异常线程的用途 2. 线程的理解(Linux 系统为例)2.1. 为什么要设计Linux“线程"?2.2. 什么是进程?2.3. 关于调度的问题2…...
Ostrakon-VL-8B快速体验:上传图片让AI识别所有文字内容
Ostrakon-VL-8B快速体验:上传图片让AI识别所有文字内容 你是不是经常遇到需要从图片中提取文字的情况?无论是店铺招牌、商品标签还是文档截图,手动输入既费时又容易出错。今天,我将带你快速体验Ostrakon-VL-8B这个强大的多模态视…...
SDXL 1.0绘图工坊:基于Docker的本地部署方案,纯离线无网络依赖
SDXL 1.0绘图工坊:基于Docker的本地部署方案,纯离线无网络依赖 1. 为什么选择本地部署SDXL 1.0 在AI绘图领域,SDXL 1.0代表了当前最先进的图像生成技术。与在线服务相比,本地部署具有三大不可替代的优势: 数据隐私保…...
SEO_资深运营揭秘,长期稳定排名的SEO策略介绍
SEO策略的核心要素:内容质量 在资深运营者的经验中,内容质量始终是SEO策略的核心要素。一个优质的网站,首先需要提供高质量、有价值的内容,这不仅能吸引用户,还能提升网站在搜索引擎中的排名。长期稳定的SEO排名离不开…...
别再手动画线了!用uniapp+高德地图SDK,5分钟搞定微信小程序轨迹绘制(附完整代码)
零基础实现UniApp高德地图轨迹绘制:从原理到实战封装 在移动应用开发中,地图轨迹功能是许多场景的刚需——从外卖配送路线、共享单车行程记录到物流追踪系统。传统实现方式往往需要开发者手动处理大量坐标点、编写复杂的画线逻辑,这不仅效率低…...
代理商客户归管+赊欠账明细查询,易特进销存商贸版一键解决
做商贸生意的朋友,大概率会遇到这样的难题:发展了代理商拓展市场,代理商的客户却需要公司统一管理,既要明确客户归属,又要精准统计赊欠账目。比如代理商张三,总共欠公司1万元,查账时想清晰看到他…...
告别环境冲突:基于快马平台与homebrew打造团队高效统一开发环境
作为一名长期与团队协作的开发者,我深刻体会到环境配置不一致带来的痛苦。新同事入职要花一整天配环境,不同项目依赖冲突导致"在我机器上能跑"的经典问题,甚至同一项目组因为系统更新节奏不同而出现隐性兼容问题。最近尝试用homebr…...
模电学习难点解析与实战突破指南
1. 为什么模电让人如此头疼?作为一名在电子行业摸爬滚打多年的工程师,我完全理解大家学习模拟电路时的痛苦。记得我大学时第一次接触模电课,老师讲了三遍共射放大电路,我愣是没听懂。直到后来在实际项目中反复调试电路,…...
OpenClaw+Qwen3.5-9B:个人知识库自动更新系统
OpenClawQwen3.5-9B:个人知识库自动更新系统 1. 为什么需要自动化知识管理 作为一个长期使用Obsidian管理个人知识库的用户,我经常面临一个痛点:收集的资料越来越多,但整理的时间却越来越少。每天订阅的几十个RSS源、技术博客和…...
MPL115A2气压传感器驱动开发与嵌入式I²C实践
1. MPL115A2气压传感器技术解析与嵌入式驱动开发实践MPL115A2是由NXP(原Freescale)推出的一款高精度、低功耗、IC接口的绝对气压传感器,专为消费电子和工业应用中的海拔高度测量、天气监测及气压补偿等场景设计。该器件采用MEMS压阻式传感原理…...
[具身智能-231]:OpenCV的库文件为啥是cv2, 而不是cv?
这是一个非常经典的问题!很多初学者在写代码时都会感到困惑:明明安装的是 opencv-python,为什么导入时却要写 import cv2?而且这个 "2" 到底代表 OpenCV 2 还是 OpenCV 3/4?简单直接的回答是:cv2…...
