当前位置: 首页 > news >正文

C# APS.NET CORE 6.0 WEB API IIS部署

1.创建 APS.NET CORE6.0 WEB API项目

默认选项即可

源代码:

项目文件展开:

launchSettings.json

{"$schema": "https://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication": false,"anonymousAuthentication": true,"iisExpress": {"applicationUrl": "http://localhost:19488","sslPort": 44308}},"profiles": {"ServerSideApi": {"commandName": "Project","dotnetRunMessages": true,"launchBrowser": true,//"launchUrl": "swagger",//"applicationUrl": "https://192.168.3.24:8080;http://192.168.3.24:8081","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}},"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"launchUrl": "swagger","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}}
}

Controllers\HomeController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ServerSide.BLL;
using ServerSide.Common;
using ServerSide.Models;namespace ServerSideApi
{[Route("api")][ApiController]public class HomeController : ControllerBase{readonly IService<Users>? usersService;public HomeController(IService<Users> usersService){this.usersService = usersService;}[HttpGet("GetLogin")]//GetLogin {}{account}/{password}public async Task<string> Get(string account, string password){//jwt token//登录成功之后生成令牌{account:'zhangsan',password:'123456'}string? token = "0";//token令牌Users? users= await usersService!.GetAsync(m => m.Account == account&& m.Password == DataEncrypt.MD5Encrypt(password));if (users != null) {token = Guid.NewGuid().ToString(); //users.Account;RedisCache.SetCache(token, users.Account!);//36不会重复}return token;}}
}

Controllers\SystemActionController.cs

using Bogus.Bson;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ServerSide.Common;
using ServerSide.DAL;
using ServerSide.Models;
using System.Text.Json.Nodes;namespace ServerSideApi.Controllers
{public class SystemActionController : Controller{private string msgModel = "{{\"code\":{0},\"message\":\"{1}\",\"result\":{2}}}";//检查用户名是否已注册/// <summary>/// 获取对应订单激活码/// </summary>/// <param name="OrderInfo">订单号</param>/// <returns></returns>#region 获取激活码[HttpGet("GetActionKey")]//GetLogin {}{account}/{password}public string GetActionKey(string OrderInfo){string systemActionKey = string.Empty;int i = 0;using (EFContext db=new EFContext()){systemActionKey = db!.SystemActionEntity!.ToList()!.Where((s) => s.OrderInfo == OrderInfo && s.ActionStatId == 2).FirstOrDefault()!.KeyCode!;if(systemActionKey.Length>5){db!.SystemActionEntity!.ToList()!.ForEach((s) => {if (s.KeyCode == systemActionKey){s.ActionStatId = 3;}i=db!.SaveChanges();LogHelper.Info(i > 0 ? $@"OrderInfo:{OrderInfo} Action Key Read {systemActionKey} PASS" : $@"OrderInfo:{OrderInfo} Action Key Read FAIL");  });}if (i>0||systemActionKey.Length>5)return string.Format(msgModel, (int)(ResponseCode.成功), "成功", systemActionKey);elsereturn string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", "null");}}#endregion/// <summary>/// 获取对应订单末激活信息/// </summary>/// <param name="OrderInfo">订单信息</param>/// <returns></returns>#region 获取末激活数据[HttpGet("GetAllNotActionData")]//GetLogin {}{account}/{password}public string GetAllNotActionData(string OrderInfo){List<SystemActionEntity>systemActionEntities = new List<SystemActionEntity>();using(EFContext db=new EFContext()){db!.SystemActionEntity!.ToList()!.ForEach((s) => { if(s.OrderInfo==OrderInfo&&s.ActionStatId==2)//1.已激活、2.末激活中、3.激活中{systemActionEntities.Add(s);}});}LogHelper.Info(systemActionEntities.Count > 0 ? $@"OrderInfo:{OrderInfo} Not Action Data Read PASS" : $@"OrderInfo:{OrderInfo} Not Action Data Read FAIL");if (systemActionEntities.Count>0){return string.Format(msgModel, (int)(ResponseCode.成功), "成功", JsonConvert.SerializeObject(systemActionEntities));}elsereturn string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", JsonConvert.SerializeObject(systemActionEntities));}#endregion/// <summary>/// 获取所有激活数据/// </summary>/// <param name="OrderInfo">订单信息</param>/// <returns></returns>#region 获取所有已激活的数据[HttpGet("GetAllIsActionData")]public string GetAllIsActionData(string OrderInfo) //List<SystemActionEntity>{lock(this){List<SystemActionEntity> systemActionEntities = new List<SystemActionEntity>();using (EFContext db = new EFContext()){db!.SystemActionEntity!.ToList()!.ForEach((s) => {if (s.OrderInfo == OrderInfo && s.ActionStatId == 1)//1.已激活、2.末激活中、3.激活中{systemActionEntities.Add(s);}});}if (systemActionEntities.Count > 0){return string.Format(msgModel, (int)(ResponseCode.成功), "成功", JsonConvert.SerializeObject(systemActionEntities));}else{return string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", JsonConvert.SerializeObject(systemActionEntities));}}    }#endregion/// <summary>/// 更新激活数据/// </summary>/// <param name="macAddress">mac地址</param>/// <param name="BarcodeNo">sn条码</param>/// <param name="keyCode">激活码</param>/// <returns></returns>#region 更新激活数据[HttpPut("UpdateActionData")]public string UpdateActiopnData(string macAddress,string BarcodeNo,string keyCode){using(EFContext db = new EFContext()) {db!.SystemActionEntity!.ToList()!.ForEach((s) => {if(s.KeyCode==keyCode){s.MacAddress = macAddress;s.ActionStatId = 1;s.BarcodeNo = BarcodeNo;}});int result=db!.SaveChanges();if(result>0){return string.Format(msgModel, (int)(ResponseCode.成功), "成功", $@"KeyCode:{keyCode} Data Update Pass!!");}else{return string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", $@"KeyCode:{keyCode} Data Update Fail!!");}}}#endregion}
}

Controllers/UsersController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ServerSide.BLL;
using ServerSide.Common;
using ServerSide.Models;
using ServerSideApi.Filters;namespace ServerSideApi
{[ApiController, Route("api/users"),TypeFilter(typeof(UsersAuthorizeAttribute))]public class UsersController : ControllerBase{readonly IService<Users>? usersService;public UsersController(IService<Users> usersService){this.usersService = usersService;}//https://localhost:8080/api/users/zhangsan//HttpGet查询 HttpPost添加 HttpPut修改 HttpDelete删除//[HttpGet]//public List<Users> Get()//{//    return usersService!.GetAll().ToList();//}//[HttpGet("{account}")]//public Users Get(string account)//{//    return usersService!.Get(account);//}//[HttpGet("{account}/{password}")]//GetLogin//public Users Get(string account, string password)//{//    return usersService!.GetAll(m => m.Account == account//                && m.Password == DataEncrypt.MD5Encrypt(password))//        .FirstOrDefault()!;//}//[HttpPost]//添加  FromBody:规范化标识,告诉服务器是以http请求正文形式发送模式(非URL)//public int Post([FromBody] Users users)//对象形参//{//    users.Password = DataEncrypt.MD5Encrypt(users.Password!);//    return usersService!.Add(users);//}//[HttpPut]//修改//public int Put([FromBody] Users users)//对象形参//{//    return usersService!.Update(users);//}//[HttpDelete]//删除//public int Put(string account)//对象形参//{//    return usersService!.Remove(account);//}//特性[]//[TypeFilter(typeof(UsersAuthorizeAttribute))]//第一种方式//第二种方式[HttpGet]public async Task<IEnumerable<Users>> Get()//xml json List<Users>{return await usersService!.GetAllAsync();//结果集List}[HttpGet("{account}")]public async Task<Users> Get(string account){return await usersService!.GetAsync(account);}[HttpPost]//添加  FromBody:规范化标识,告诉服务器是以http请求正文形式发送模式(非URL)public async Task<int> Post([FromBody] Users users)//对象形参{users.Password = DataEncrypt.MD5Encrypt(users.Password!);return await usersService!.AddAsync(users);}[HttpPut]//修改public async Task<int> Put([FromBody] Users users)//对象形参{users.Password = DataEncrypt.MD5Encrypt(users.Password!);try{return await usersService!.UpdateAsync(users);}catch (Exception){return 0;}}[HttpDelete("delete/{account}")]//删除public async Task<int> Delete(string account)//对象形参{return await usersService!.RemoveAsync(account);}}
}

 Filters/UsersAuthorizeAttribute.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using ServerSide.Common;namespace ServerSideApi.Filters
{public class UsersAuthorizeAttribute : IAuthorizationFilter{public void OnAuthorization(AuthorizationFilterContext context){string? token = context.HttpContext.Request.Headers["token"];//"" null//有没有带Tokenif (string.IsNullOrEmpty(token)){//进来后直接返回到前端context.Result = new JsonResult(0);//文本类型text  没有授权}else//判断token是否正确{string? key = RedisCache.GetCache(token);//36位字符串在redisif (string.IsNullOrEmpty(token)){context.Result = new JsonResult(0);//没有授权}}//没进去,正常进入控制器>动作方法}}
}

Program.cs

using Microsoft.EntityFrameworkCore;
using ServerSide.BLL;
using ServerSide.DAL;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();//注入业务类
builder.Services.AddScoped(typeof(IRepository<>),typeof(Repository<>));//IOC容器
builder.Services.AddScoped(typeof(IService<>),typeof(Service<>));//注入EFCore对象
string connStr = builder.Configuration.GetConnectionString("connStr")!;builder.Services.AddDbContext<EFContext>(options=>options.UseSqlServer(connStr));//webapi请求方案
builder.Services.AddCors(options => 
{options.AddPolicy("AllowAll",options=>options.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()//method:put delete post get restful风格架构);
});//enctype="multpart/form-data" 请求头  token="asdjasdasg123123"
//http://www.baidu.com/product?id=1001  url传参 
//<form ><input type="text" name="username" /></form> 表单传参var app = builder.Build();// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
//    app.UseSwagger();//Swagger工具
//    app.UseSwaggerUI();
//}
app.UseSwagger();
app.UseSwaggerUI(c => 
{c.RoutePrefix = "";c.SwaggerEndpoint("/swagger/v1/swagger.json", "Test Web Api");
}
);
app.UseCors("AllowAll");//使用跨域方案
app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();

 设置 Swagger UI 为起始页

打开 launchSettings.json 文件
屏蔽以下两行代码

打开 Program.cs 文件
屏蔽原来的环境判断,新增以下代码 

 

app.UseSwagger();
app.UseSwaggerUI(c =>{c.RoutePrefix = "";c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiHelp V1"); //第二个参数可自定义命名});

发布项目

发布项目:右击项目 → 发布

 选择文件夹

 选择文件夹位置,这个位置就是 项目发布后的文件 所在的位置

检查 目标位置 的文件夹是否存在,不然会报错
点击 更多操作→编辑 可根据自己的项目进行设置

 

 设置好后,点击 发布

当输出显示成功即发布成功;若失败会显示具体信息供排查

2、在 IIS 部署

这里就不再阐述了,引用这位博主的文章
如何安装IIS

安装 Hosting Bundle

点击 下载 .NET(Linux、macOS 和 Windows)
下载安装 Hosting Bundle
我这里安装的是 Hosting Bundle 6.0,可根据情况适当更改

安装成功后,打开 IIS →模块 后会在列表看到 AspNetCoreModuleV2

 

 

 右键 应用程序池 添加应用程序池
选择 无托管代码

 

右键 网站 添加网站 

 

点击浏览,则会跳转到 Swagger UI 界面

 

 

3.内网穿透

 打开 控制面板 → 防火墙

 

 

 端口 → 特定本地端口
然后一直按 下一步,最后填写 名称 即可完成

 

 展示效果:

相关文章:

C# APS.NET CORE 6.0 WEB API IIS部署

1.创建 APS.NET CORE6.0 WEB API项目 默认选项即可 源代码&#xff1a; 项目文件展开&#xff1a; launchSettings.json {"$schema": "https://json.schemastore.org/launchsettings.json","iisSettings": {"windowsAuthentication"…...

C/C++ 常用加密与解密算法

计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性&#xff0c;常常需要使用加密和解密算法。C是一种广泛使用的编程语言&#xff0c;提供了许多加密和解密算法的实现。本文将介绍一些在C中常用的加密与解密算法&#xff0c;这其中包括Xo…...

从Qt源码的角度分析Qt对象树与内存管理模式

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 一、Qt对象树(Object Tree)和父子关系二、源码角度:QObject的内存管理构造函数析构函数addChild() 和 removeChild()三、C++模拟实现Qt的对象树内存管理模式Qt框架提供了一…...

MySQL与Redis如何保证数据的一致性

文章目录 MySQL与Redis如何保证数据的一致性&#xff1f;不好的方案1. 先写 MySQL&#xff0c;再写 Redis2. 先写 Redis&#xff0c;再写 MySQL3. 先删除 Redis&#xff0c;再写 MySQL 好的方案4. 先删除 Redis&#xff0c;再写 MySQL&#xff0c;再删除 Redis5. 先写 MySQL&am…...

micropython - espnow

espnow这个东西可以很简单的进行多设备近距离互联&#xff0c;连握手都不用注册一下就能发信息 目前8266那个8角的刷20231105的1M的固件可以运行 8266目前没有信号强度功能所以我自己写的类强度返回为0 我写的类实例化后最后注册谁发消息就是给谁而接收端则是什么都接&#xff…...

京东数据采集(京东数据运营):怎样快速获取京东市场大数据?

相信京东平台的很多品牌方们都有做数据分析的需求&#xff0c;但面对多而杂的市场数据&#xff0c;很多运营者都没有思路。单依靠肉眼来看&#xff0c;很多商品的类目、销售成绩、价格分布等运营者也未必清楚。 其实对于京东平台上市场数据的获取&#xff0c;品牌可以直接借助一…...

​重生奇迹mu迷宫攻略​

重生奇迹mu迷宫是一种比较有挑战性的游戏玩法&#xff0c;需要一定的技巧和策略才能完成。以下是一些基本的攻略和技巧&#xff1a; 了解每个迷宫的特点&#xff1a;不同的迷宫有不同的规则和特点&#xff0c;需要根据迷宫的特点来制定合理的策略。在进入迷宫前可以先了解一下…...

[网络] 4. HTTP/1.1 相比 HTTP/1.0 提高了什么性能?

HTTP/1.1 相比 HTTP/1.0 性能上的改进 ● 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 ● 支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c;可以减…...

3.1.2 Linux时间子系统 hrtimer示例使用

文章目录 结构体定义接口初始化启动修改取消示例示例1示例2示例3结构体定义 struct hrtimer {struct timerqueue_node node;ktime_t _softexpires;enum hrtimer_restart...

04 _ 系统设计目标(二):系统怎样做到高可用?

这里将探讨高并发系统设计的第二个目标——高可用性。 高可用性&#xff08;High Availability&#xff0c;HA&#xff09;是你在系统设计时经常会听到的一个名词&#xff0c;它指的是系统具备较高的无故障运行的能力。 我们在很多开源组件的文档中看到的HA方案就是提升组件可…...

Android相机性能提高50%

文章目录 应用举例&#xff08;可以不看这一part&#xff0c;直接跳过看具体怎么做&#xff09;&#xff1a;Snapchat 通过 Camera2 Extensions API 将新相机功能的集成速度提高了 50%**Camera2 扩展 API 可以访问高级功能更多设备上的更多机会 正文&#xff1a;开始使用扩展架…...

STM32F103C8T6第5天:独立看门狗、窗口看门狗、dma实验

1. 独立看门狗IWDG介绍&#xff08;341.45&#xff09; 什么是看门狗&#xff1f; 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#…...

QT已有项目导入工程时注意事项

文章目录 从qt其他版本上开发的工程导入另一qt版本时 从qt其他版本上开发的工程导入另一qt版本时 这里以之前在qt5.12.2上开发的项目为例&#xff0c;现在到在qt6.5.3上运行。 不能直接导入IDE上&#xff0c;否则会报各种莫名奇妙的错误。 首先要把扩展名位.pro.user文件 删掉…...

Django视图层

一、请求与响应 视图函数 视图函数&#xff0c;简称视图&#xff0c;属于Django的视图层&#xff0c;默认定义在views.py文件中&#xff0c;是用来处理web请求信息以及返回响应信息的函数&#xff0c;所以研究视图函数只需熟练掌握两个对象即可&#xff1a;请求对象(HttpRequ…...

我在electron中集成了自己的ai大模型

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、大模型选择二、获取key三、调用api四、调用ai模型api时&#xff0c;解决跨域总结 前言 最近单位把gpt、文心一言、通义千问、星火等等等等你能想到的ai大模型都给禁掉了&#xff0c;简直丧心病狂。 不知道有多少感同…...

oracle rac环境归档日志清除

文章目录 一、处理步骤1、使用终端登录上服务器查看磁盘使用状态2、使用恢复备份管理工具RMAN删除归档日志 二、详细操作步骤三、定时任务自动清归档日志1、编写删除脚本4、测试脚本运行情况5、设置定时任务每周执行一次&#xff0c;并测试运行效果 昨天单位的所有系统都连不上…...

【数据结构】树与二叉树(廿六):树删除指定结点及其子树(算法DS)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲3. 搜索指定数据域的结点4. 删除结点及其左右子树a. 逻辑删除与物理删除b. 算法DSTc. 算法解析d. 代码实现递归释放树算法DS e. 算法测试 5. 代码整合…...

交叉编译 和 软硬链接 的初识(面试重点)

目录 交叉编译的初认识Q&A Q1: 编译是什么&#xff1f; Q2: 交叉编译是什么&#xff1f; Q3: 为什么要交叉编译 Q3.1&#xff1a;树莓派相对于C51大得多&#xff0c;可以集成编译器比如gcc&#xff0c;那么树莓派就不需要交叉编译了吗&#xff1f; Q4: 什么是宿主机和…...

Docker attach 命令

docker attach&#xff1a;连接到正在运行中的容器。 语法 docker attach [OPTIONS] CONTAINER要attach上去的容器必须正在运行&#xff0c;可以同时连接上同一个container来共享屏幕&#xff08;与screen命令的attach类似&#xff09;。 官方文档中说attach后可以通过CTRL-…...

Keil5个性化设置及常用快捷键

Keil5个性化设置及常用快捷键 1.概述 这篇文章是Keil工具介绍的第三篇文章&#xff0c;主要介绍下Keil5优化配置&#xff0c;以及工作中常用的快捷键提高开发效率。 第一篇&#xff1a;《安装嵌入式单片机开发环境Keil5MDK以及整合C51开发环境》https://blog.csdn.net/m0_380…...

银行数据中心基础设施建设与运维管理【1.6】

3. 5 常见问题 1. 数据中心采用吊顶还是不吊顶方案的问题 数据中心装饰装修, 可以采用无吊顶板和安装吊顶板两种方案。 数据中心建筑内房间是否吊顶, 主要取决于该房间的应用功能或空调形式, 除 IT 机房、 ECC 及人员区域, 其他房间可不设置吊顶, 走廊区域是否吊顶取决…...

终极指南:如何快速构建现代化XMPP网页聊天客户端

终极指南&#xff1a;如何快速构建现代化XMPP网页聊天客户端 Converse.js是一个功能强大、现代化的开源XMPP/Jabber网页聊天客户端&#xff0c;完全在浏览器端运行。这个100%客户端解决方案支持多种部署方式&#xff0c;可以独立使用或无缝集成到现有网站中。&#x1f680; 为…...

KubeBlocks SQL Server(MSSQL) Kubernetes Operator 高可用实现

KubeBlocks SQL Server(MSSQL) K8s Operator 高可用实现 背景 Microsoft SQL Server&#xff08;MSSQL&#xff09;是由微软开发的一款关系型数据库管理系统。最初仅支持在 Windows 平台上运行&#xff0c;自 2017 版本起开始支持 Linux 系统&#xff0c;这一变化为 MSSQL 的…...

Qt中waitForReadyRead与waitForBytesWritten的陷阱与实战优化

1. 深入理解Qt阻塞式IO的工作原理 在Qt网络编程中&#xff0c;waitForReadyRead()和waitForBytesWritten()这两个函数就像两个尽职的门卫&#xff0c;它们会一直守在数据通道的两端&#xff0c;直到有数据到达或超时。但很多开发者在使用时常常忽略它们的内部机制&#xff0c;这…...

C语言数组零基础入门:一维二维全讲透

知晓学C语言的友人都清楚&#xff0c;数组是无法避开的关键知识点&#xff0c;还是后续学习结构体、链表的根基。好多新手初次接触之际&#xff0c;被一维数组、二维数组、字符数组弄得晕头转向&#xff0c;就连冒泡排序、选择排序的逻辑都梳理不清楚。致使今日之这篇文章&…...

解锁多光谱图像数据集:从入门到精通的实战指南

1. 多光谱图像数据集入门指南 第一次接触多光谱数据时&#xff0c;我被那些五颜六色的波段图搞得晕头转向。记得当时为了搞明白WorldView-3卫星的8个波段分别代表什么&#xff0c;整整花了两天时间查资料。现在回头看&#xff0c;其实掌握多光谱数据并没有想象中那么难&#xf…...

南麟 LN1182 高精度 CMOS 低压差线性稳压器 封装 SOT23-6L

产品描述南麟 LN1182 是一款双通道、独立使能、高精度 CMOS 低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;采用先进低功耗工艺设计&#xff0c;单芯片集成两组完全独立的稳压电路&#xff0c;每通道均具备独立反馈网络、独立使能控制、限流及保护电路&#xff0c;专…...

014集——CSV格式坐标批量导入CAD图纸(C#二次开发高效技巧)

1. CSV坐标批量导入CAD的实战价值 每次遇到需要把几百个坐标点画到CAD图纸的情况&#xff0c;你是不是还在手动一个个输入&#xff1f;我在某次水利工程测绘项目中&#xff0c;就亲眼见过同事对着纸质表格敲了整整两天坐标。其实用C#二次开发配合CSV文件&#xff0c;20秒就能搞…...

MedGemma 1.5医疗AI助手:基于Linux系统的部署与优化

MedGemma 1.5医疗AI助手&#xff1a;基于Linux系统的部署与优化 1. 引言 医疗AI正在改变传统的诊疗方式&#xff0c;但很多医疗机构面临数据隐私和网络安全的挑战。MedGemma 1.5作为谷歌开源的医疗多模态模型&#xff0c;提供了完全本地化部署的解决方案&#xff0c;让医院和…...

面了个新人连Agent如何进行冷启动都不知道

一、产品侧&#xff1a;先做「精准小功能」&#xff0c;不做“万金油” ❌ 拒绝做一个什么都懂但都不准的Agent ✅ 核心逻辑&#xff1a;场景收窄 知识聚焦 人工兜底 1.只攻一个垂直场景 ToB方向&#xff1a;比如“合同审核Agent”. “电商售后Agent”&#xff0c;场景越…...