前言
最近一直在练习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函数中加入
代码语言:javascript复制 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
代码语言:javascript复制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();
}
}
}