技术 思绪 摘录 旅行
最近了解了一下.NET Core WebApi,觉得很有意思,其中的思想与.NET Framework相比,确实要更兼容更多场景,为跨平台而生,但是因为这些差异,我们.NET Framework的知识在有些时候是不适用的,这里做一个交流。

一、创建CoreWebApi项目,我选择的.NET Core 2.1,创建好之后,已经为我们生成了ValuesController示例,里面有基本的api。

image.png

    1、我发现这里多了一个wwwroot的貌似文件夹的东西,这个我只是在有些虚拟主机根目录见过,其实这个东西在.NET Core的web项目中,它就是根目录,你创建一个.NET Core WebMVC项目,你会发现,静态文件都在wwwroot中,你要访问只需要输入~/就能访问到;为啥静态文件独立出来了,不是还有视图文件夹在根目录吗?现在不是这样了。

    2、以前的Views视图文件,也会默认编译成dll文件,所以根目录下可能不存在views文件夹了,当然可以配置,让他不编译,视图文件经常修改嘛。

            

用记事本打开.csproj项目文件,修改PropertyGroup节点,增加MvcRazorCompileOnPublish节点即可
<PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>


二、Post请求中,api用[FromBody]类型接收参数。

        /// <summary>
        /// Posts the specified value.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns>ActionResult&lt;System.String&gt;.</returns>
        [HttpPost]
        public ActionResult<string> Post([FromBody] string value)
        {
            return "获取到:"+value;
        }


这里很多人说请求之后接收不到,然后写参数的时候key写成空,虽然能接收到,但是肯定是不对的写法嘛,怎么可能设计成{“”:“123”}这样的方式嘛。

当FormBody后面跟着是string的时候,直接传字符串,当后面跟着对象的时候,传对象,这里很多人能接收到对象,接收不到string。


            $.ajax({
                url:"https://localhost:44302/api/values",
                type: "post",
                contentType: "application/json; charset=UTF-8",
                data:"13777777777",
                success: function (ret) {
                    console.log(ret);
                },
                error: function (jqxhr, textStatus, errorthrown) {
                    alert(textStatus);
                }
            });


其中重要的是:contentType: "application/json; charset=UTF-8"

如果没有这句,那么默认当成对象传输,传输过程中可能就被定义为下面这种形式:


=13777777777
或者
13777777777=


很多问题就出在这里,当定义成这种样式的时候,.Net CoreApi报400错误,提示有未被识别的字符=号


三、跨域,WebApi直接被请求,肯定是不行的,而且我们还在请求头里面修改了一个contentType,所以肯定是跨域拦截了,请求不通。

     CoreApi配置很简单,在Startup.cs中ConfigureServices方法里面配置如下


            services.AddCors(options =>
            {
                options.AddPolicy("any", builder =>
                {
                    builder.AllowAnyOrigin() //允许任何来源的主机访问
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials();//指定处理cookie
                });
            });

     

    添加配置之后,就可以以特性的方式进行使用了


[EnableCors("any")]


image.png


四、部署,这里说的是部署在IIS

        1、我们先想个问题,.NET Core WebApi的能不能运行在IIS?

                答案:废话,肯定可以,IIS只是一个服务器软件,它能运行大多数语言的后台程序。


        2、我们原先的.NET Framework Web程序的发布方式还能不能适用于.NET Core Web程序?

                答案:不能,你把.NET Framework和.NET Core理解一下,.NET Core是跨平台的,为了有跨平台性,运行方式肯定不可能和之前的一样。


        3、我们要怎么样在IIS中运行.NET Core的程序?

                答案:需要安装Windows环境的.NET Core 运行时。

        

        我们搞清楚了以上几个问题,解决起来就胸有成竹了。

        1、前往官网下载运行时,地址:https://dotnet.microsoft.com/download

image.png

        2、安装完成之后,重启IIS,然后发现有个变化,模块中多了运行.NET Core 的一个模块。


    image.png

           3、有了运行模块还不行,需要配置一下你的程序池。就ok了

        image.png

            为什么改成这样,因为有默认的.NET Core的模块来运行程序了,这是.NET Framework的运行方式,当然不能使用。

    

有问题积极的留言交流

CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

友情打赏

请打开您的微信,扫一扫