c# webApi 获取不到入参,强制输入json解决方案

本文记录了在ASP.NET WebAPI中处理登录模块时遇到的问题,即无法通过FromBody获取POST参数。经过尝试,发现需要创建一个模型类来接收JSON数据,或者使用JObject来解析参数。最终解决了问题,并介绍了使用FromUrl进行URL参数传递以及如何强制返回JSON格式响应的方法。

问题描述

做一个登录模块,提供api给前端调用,发现死活拿不到入参。最开始的写法如下:

 public string Login([FromBody] string InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData);
            return InData;
            }

postman调用如下:
在这里插入图片描述
查看本地日志:
在这里插入图片描述
居然为空!

解决思路

  1. 百度,发现此类问题不多,所以记录一下。
  2. 查到一种方法,说需要新建一个模型类,用于接收结果,才能显示。于是尝试:
public class DataModel
        {
           public string InParam
            {
                get;
                set;
            }
        }
        
         public string Login([FromBody] DataModel InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData.InParam);
            return InData.InParam;
            }

结果同上,没有效果,于是猜测可能接收到的不是一个string,所以都赋值不过去。

  1. 再查,发现postman的content-type →application/json,于是想用一个json类来接收,于是改造代码如下:
public string Login([FromBody] JObject InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData.ToString());
            return InData.ToString();
            }

嘿,还真可以!
在这里插入图片描述
不知道这种接收方式是谁想出来的。
问题解决!

拓展

再拓展一下:

  1. FormBody跟FromUrl
    在这里插入图片描述
  2. 使用url的post方式:
 [Route("test")]
        [HttpPost]
        public string TestReturn(string a,string b)
        {
            //读取登录json
            Log.AddTrack("LoginController.TestReturn(", "Begin");
            return a + b;
        }

在这里插入图片描述postman调用方式:
在这里插入图片描述
3. webApi强制返回json:
在这里插入图片描述
正常的返回应该是没有的,在本地日志也看不出来,要解决这个问题,可以采用HttpResponseMessage来返回,核心代码如下:

//返回纯文本text/plain  ,返回json application/json  ,返回xml text/xml
            HttpResponseMessage result = new HttpResponseMessage
            {
                
                Content = new StringContent(outParam, 
                Encoding.GetEncoding("UTF-8"), 
                "application/json") 
            };
            return result;

代码示例:

public HttpResponseMessage Login([FromBody] JObject InData)
        {

            //读取登录json
            Log.AddTrack("LoginController.Login", "Begin");
            Log.AddTrack("LoginController.Login", "收到入参:" + InData.ToString());

            string userNo = InData["userNo"].ToString();
            string passWord = InData["passWord"].ToString();
            string outParam = HOTLogin(userNo, passWord);

            //返回纯文本text/plain  ,返回json application/json  ,返回xml text/xml
            HttpResponseMessage result = new HttpResponseMessage
            {
                
                Content = new StringContent(outParam, 
                Encoding.GetEncoding("UTF-8"), 
                "application/json") 
            };
            return result;
        }

postman调用示例:
在这里插入图片描述

参考链接:

https://blog.csdn.net/PLA12147111/article/details/89666797
https://www.cnblogs.com/rohelm/p/3207430.html

<think>嗯,用户想在ASP.NET Core 5的WebAPI里用FreeSQL实现多数据库切换和读写分离。首先,我需要回忆一下FreeSQL的相关功能,特别是关于读写分离和多数据库的支持。根据引用[4],FreeSQL支持多种数据库,并且有读写分离和分表分库的功能。那读写分离的具体配置应该是怎样的呢? 用户提到的多数据库切换,可能是指应用需要连接不同的数据库类型,比如同时支持MySQL和SQL Server?或者是在同一数据库类型下的多个实例切换?这里可能需要进一步确认,但根据问题描述,可能是指同一数据库类型下的主从库切换,实现读写分离。 首先,安装FreeSQL的NuGet包是必须的,用户需要安装FreeSql和FreeSql.Provider.SqlServer或者其他的数据库驱动。然后,创建主库和从库的连接字符串。根据引用[4],FreeSQL的配置可以通过UseConnectionString方法设置主库和从库。 读写分离的实现可能需要配置主库为写操作,从库为读操作。FreeSQL的文档中提到可以使用UseSlave方法来指定从库的连接字符串,这样在查询时会自动选择从库,而增删改操作则走主库。但用户需要确认是否支持动态切换,比如根据操作类型自动选择数据源。 另外,多数据库切换可能涉及不同数据库类型之间的切换,比如同时支持MySQL和SQL Server。这时候可能需要创建多个IFreeSql实例,每个实例对应不同的数据库类型。例如,一个实例处理MySQL,另一个处理SQLServer,然后根据请求中的数动态选择使用哪个实例。 不过,用户的问题更可能是针对同一数据库类型下的多个实例(如主从库)的读写分离。这时候,FreeSQL的配置应该是在一个IFreeSql实例中配置多个从库连接,并设置负载均衡策略,比如随机选择从库进行查询。 接下来,代码示例部分需要展示如何配置主从库,以及如何在服务中注册IFreeSql。例如,在Startup.cs的ConfigureServices方法中,创建FreeSql实例,配置主库和从库的连接字符串,设置负载均衡策略为随机,然后注为单例。 对于多数据库切换,比如支持不同的数据库类型,可能需要创建多个IFreeSql实例,每个实例对应不同的数据库提供程序。例如,一个实例使用SqlServerProvider,另一个使用MySqlProvider。然后在控制器或服务层中根据条件选择对应的实例进行操作。这可能需要使用工厂模式来管理多个IFreeSql实例。 读写分离的注意事项包括数据同步延迟,所以需要根据业务需求决定是否允许延迟读取。此外,事务中的操作可能需要强制走主库,可以使用WithConnection方法指定主库连接。 引用[3]提到的EFCore.BulkExtensions可能不相关,但引用[4]详细说明了FreeSQL的功能,需要重点考。用户可能需要配置多个从库,并确保在查询时自动路由到从库,而写操作到主库。FreeSQL的文档是否有具体的读写分离配置示例?根据引用[4],是的,可以通过UseSlave方法来添加从库连接字符串。 总结步骤应该是:安装NuGet包,配置主从连接字符串,创建IFreeSql实例并配置读写分离策略,注服务,然后在Repository或服务层中使用IFreeSql进行数据库操作,FreeSQL会自动处理读写分离。对于多数据库切换,可能需要多个IFreeSql实例,根据条件选择使用哪个实例。 最后,相关问题部分需要生成与FreeSQL、读写分离、多数据库相关的问题,比如如何监控主从同步状态,如何处理跨库事务,或者如何扩展更多的数据库类型支持。</think>### C# ASP.NET Core 5 WebAPI 实现 FreeSQL 多数据库切换与读写分离方案 #### 一、实现步骤 1. **安装 NuGet 包** ```bash Install-Package FreeSql Install-Package FreeSql.Provider.SqlServer # 根据实际数据库类型选择(如 MySql、PostgreSQL 等) ``` 2. **配置多数据库连接** ```csharp // 在 appsettings.json 中配置主从库连接字符串 "ConnectionStrings": { "Master": "Server=master_server;Database=db;User=user;Password=pwd;", "Slave1": "Server=slave1_server;Database=db;User=user;Password=pwd;", "Slave2": "Server=slave2_server;Database=db;User=user;Password=pwd;" } ``` 3. **初始化 FreeSql 实例并配置读写分离** ```csharp public void ConfigureServices(IServiceCollection services) { // 创建主库实例 var masterDb = new FreeSqlBuilder() .UseConnectionString(DataType.SqlServer, Configuration.GetConnectionString("Master")) .Build(); // 添加从库并配置负载均衡策略(随机选择从库) masterDb.SetSlaves(slaves => slaves .Add(Configuration.GetConnectionString("Slave1")) .Add(Configuration.GetConnectionString("Slave2")) .UseStrategy(ReadStrategy.Random) ); services.AddSingleton<IFreeSql>(masterDb); services.AddControllers(); } ``` 4. **多数据库切换实现** ```csharp // 若需支持多种数据库类型(如同时支持 MySQL 和 SQL Server) var mysqlFsql = new FreeSqlBuilder() .UseConnectionString(DataType.MySql, "mysql_connstr") .Build(); var sqlserverFsql = new FreeSqlBuilder() .UseConnectionString(DataType.SqlServer, "sqlserver_connstr") .Build(); // 通过工厂模式注多个实例 services.AddSingleton<IDbFactory>(new DbFactory(mysqlFsql, sqlserverFsql)); ``` #### 二、读写分离操作示例 ```csharp public class UserRepository { private readonly IFreeSql _fsql; public UserRepository(IFreeSql fsql) => _fsql = fsql; // 写操作自动路由到主库 public void AddUser(User user) => _fsql.Insert(user).ExecuteAffrows(); // 查询操作自动路由到从库 public List<User> GetUsers() => _fsql.Select<User>().ToList(); // 强制使用主库查询(解决主从延迟问题) public User GetLatestUser() => _fsql.Select<User>().WithConnection(_fsql.Ado.MasterPool).First(); } ``` #### 三、关键配置说明 | 配置项 | 说明 | |-------------------|--------------------------------------------------------------------| | `SetSlaves()` | 定义从库连接池,支持多个从库地址[^4] | | `ReadStrategy` | 负载均衡策略(Random/WeightRandom/轮询) | | `WithConnection()`| 强制指定连接池(如强制读主库) | #### 四、注意事项 1. **主从同步延迟** 写后立即查询建议使用`WithConnection(_fsql.Ado.MasterPool)`强制读主库 2. **事务处理** 事务操作默认使用主库连接,需确保事务内所有操作在同一连接 3. **多数据库类型支持** 若需同时操作 MySQL 和 SQL Server,需创建独立的`IFreeSql`实例[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值