Unity3D网络通讯(一)--Asp.Net Core WebApi创建发布注意事项

2020-09-10 16:29:59 浏览数 (1)

前言

最近一直在练习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();
        }


    }
}

0 人点赞