Unity3D网络通讯(一)--Asp.Net Core WebApi创建发布注意事项
前言
最近一直在练习Unity3D,如果在项目中肯定少不了与后台交互,所以就准备把Unity中和后台交互这块专门做点Demo学习和掌握一下,计划是包括Http Restful,Socket,Webservice等方式都练习一下,本章就开始先从后台的Asp.Net Core的WebApi创建和发布开始。
Asp.Net Core WebApi后端
微卡智享
原本就是想怎么简单怎么来,而且.Net Core现在升级到3.1了,不说需要完全掌握,起码也有个了解,所以觉得创建一个简单的WebApi项目,把Get和Post的方法一实现,主要还是写一下Unity的调用就好了。结果在创建后调用Get方法时是接收不到数据的,这篇主要就是说一下创建及发布过程中遇到的问题和解决方法。
01
Api简单介绍
我们默认创建了一个.Net Core的项目
项目中有一个默认的天气类(WeatherForecast)和调用的WeatherForecast的默认Get方法。
直接运行后可以看到显示出来返回的Json格式数据。
02
发布时注意事项
由于我自己是Windows的系统,所以发布的还是和MVC的一样用的是文件格式的发布。
上面是项目发布后的目录,可以看到,不过是项目代码里面比MVC项目上轻了很多,发布后的也轻量了不少。
安装dotnet-hosting
网址:https://dotnet.microsoft.com/download/dotnet-core/3.1
按上面的网址,我直接找了的.net core 3.1的版本,然后右侧红框那点击Hosting Bundle进行下载,下载后安装即可。
安装后可以在IIS里的模块里面看到AspNetCoreModule和AspNetCoreModuleV2这两个,如果没有这两项的话,我们发布的NetCore的网站是访问不了的。
配置应用程序池
我们创建了一个NetCoreWebTest的网站,在IIS创建网站这块我就不多说了。
如上图,要注意的点里面在应用程序池中我们的.Net CLR的版本要改为无托管代码。
03
Json大小写的问题
其实按照上面两步,基本我们的IIS的网站也搭建成,可以正常使用了,不过我在用Unity3D调用的时候发现Json反序列化时对应的类值都解析不出来,搜索查了一下原因是Unity3D默用的Json序列化组件是JsonUnity,它对大小写比较敏感,而NetCore3.1之后默认的序列化组件改为了System.Text.Json,序列化的默认行为有变。即然这样我们还是用我们最习惯的NewtonsoftJson组件吧。
在项目中管理NuGet包中下载Miscrosoft.ApsNetCore.Mvc.NewtonsoftJson,我这直接下的最新3.1.7的版本。
然后在startup.cs的ConfigureServices函数中加入
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson(opt =>
{
opt.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
});
//services.AddControllers();
}
完成后我们再重新编译和发布,即可解决这个问题了。
原始的WeatherForecast类的属性
默认的System.Text.Json与Newtonsoft.Json的序列化对比,可以看到默认的System.Text.Json中把我们类属性全都转为小写了,而用了Newtonsoft.Json后还是按类属性的原值输出的。
改为NewtonsoftJson后,Unity3D使用JsonUnity也可以正常反序列化了。
Controller代码
微卡智享
下面贴的是Controller的代码,其中Get里面加入了一个路由用于调用带参数的方法,又添加了一个Post的方法,下一章就写Unity3D怎么调用的Get和Post
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace WebTestDemo.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
[HttpGet("Info")]
public IEnumerable<WeatherForecast> Get(string Summary)
{
var rng = new Random();
return Enumerable.Range(1,1).Select(idx => new WeatherForecast
{
Date = DateTime.Now.AddDays(idx),
TemperatureC = rng.Next(-20, 55),
Summary = Summary
})
.ToArray();
}
[HttpPost("Reg")]
public IEnumerable<WeatherForecast> Post([FromBody]WeatherForecast forecast)
{
forecast.Summary += " Good";
return Enumerable.Range(1, 1).Select(p => forecast).ToArray();
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GXYCTF2019-PingPingPing
- 利用cloudflareWorkers制作Google镜像站
- MySQL information_schema详解 COLLATIONS
- 极客大挑战2019-Knife
- DB2备份还原相关操作
- MySQL复制全解析 Part 8 MySQL Auto-Positioning
- Redis 5.0.8 主从搭建
- Linux 修改网卡名称及mac地址
- MySQL Galera Cluster全解析 Part 10 grastate.dat文件详解
- MySQL MHA部署 Part 7 MHA手动切换测试
- 使用sysbench进行压测 Part2 sysbench语法介绍
- mysqlbinlog命令详解 Part 1-实验环境准备
- mysqlbinlog命令详解 Part 2 -MySQL 事件类型
- mysqlbinlog命令详解 Part 4 -查看行事件具体SQL语句
- mysqlbinlog命令详解 Part 5 通过位置和时间查看日志