精华内容
下载资源
问答
  • asp.netcore.pdf

    2020-09-27 17:39:55
    asp.netcore基础知识介绍。整理了微软官方asp.netcore的知识介绍。适合平时进行学习、提炼、提高asp.netcore水平。
  • ASP.NETcore.pdf

    2019-08-11 22:51:31
    这是2019年七月出的ASP.NETcore的官方文档,ASP.NETcore是跨平台的,支持Linux以及Docker,应该对所有喜欢C#的程序员有帮助。
  • Asp.Netcore内Panda.DynamicWebApi的使用方法,以及如何使用Panda.DynamicWebApi来使Controller何Server解耦 主题:Asp.netcore Code First +DDD学习笔记 目录: 【一】 CodeFirst+DDD项目结构的构建 【二...

    在Asp.Netcore内Panda.DynamicWebApi的使用方法,以及如何使用Panda.DynamicWebApi来使Controller何Server解耦

     

    主题:Asp.netcore Code First +DDD学习笔记

    目录:

       【一】 CodeFirst+DDD项目结构的构建

       【二】Asp.Netcore使用Panda.DynamicWebApi来进行Controller解耦

       【三】Asp.NetCore使用Efcore+Mysql实现CodeFirst

       【四】EfCore实现全自动化迁移

         案例代码下载点击

       当我们把Controller单独建成一个项目来解耦Controller后,Api那边进行了引用,发现接口并没有生成,但是我们需要接口生成。通过Abp我们知道了需要动态生成接口,于是找到了一个动态生成接口的组件:Panda.DynamicWebApi。

     引用官方的一段话

    Panda.DynamicWebApi 是一个动态生成WebApi的组件,生成的API符合Restful风格,受启发于ABP。它可以根据符合条件的类来生成WebApi,由MVC框架直接调用逻辑,无性能问题,完美兼容Swagger来构建API说明文档,与手动编写Controller相比并无区别。

    应用场景:DDD架构中的应用逻辑层,可使用本组件来直接生成WebApi,而无需再用Controller来调用。

    git地址:https://github.com/dotnetauth/Panda.DynamicWebApi/blob/master/README_zh-CN.md

    【二】Controller使用Panda.DynamicWebApi

    1、首先理解Panda.DynamicWebApi组件动态生成webApi的机制。

    (1)要让类生成动态API需要满足两个条件,一个是该类直接间接实现 IDynamicWebApi,同时该类本身或者父抽象类或者实现的接口具有特性 DynamicWebApi

    (2)添加特性 [NonDynamicWebApi] 可使一个类或者一个方法不生成API,[NonDynamicWebApi] 具有最高的优先级

       更多机制请看git源码那里的第二步有详细介绍

    2、开始载入组件

    (1)在Api项目上管理Nuget包里面搜索并安装Panda.DynamicWebApi和Swashbuckle.AspNetCore(该组件时swagger组件),给Controller项目上安装Panda.DynamicWebApi,如图所示:

     (2)在Api项目上注入该组件。

              删除Api上面的Controller文件夹,使Api项目如下图所示 

                

             在Startup文件里的ConfigureServices方法下添加如下代码

              

               //动态生成Api接口
                services.AddDynamicWebApi();
                //配置SwaggerApi自动生成器
                services.AddSwaggerGen(options =>
                {
                    options.DocInclusionPredicate((docName, description) => true);//swagger支持动态生成的api接口
                    options.CustomSchemaIds(type => type.FullName);               //swagger支持动态生成的api接口
    
                    options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
                    var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取代码运行的相对路径
                    options.IncludeXmlComments(Path.Combine(basePath, "Api.xml"), true);//插入代码上的注释放入Swagger
                    options.IncludeXmlComments(Path.Combine(basePath, "ApiController.xml"), true);
                });

            在Startup文件里的Configure方法下添加如下代码

               //使用SwaggerApi自动生成器
                app.UseSwagger();
                //使用SwaggerApi自动生成器的Ui界面
                app.UseSwaggerUI(option =>
                {
                    option.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
                });

           这样添加完成后,由于之前Api项目引用了Controller项目,只要Controller项目里面满足Panda.DynamicWebApi的接口生成机制(直接间接实现 IDynamicWebApi+具有DynamicWebApi特性)就会自动生成接口,并且会在swagger(不了解Swagger的可以点击来进行详细了解)上显示出来,如下:

         在Controller项目添加一个TestController的测试类

       

      代码如下:

    using Panda.DynamicWebApi;
    using Panda.DynamicWebApi.Attributes;
    
    namespace Controller
    {
        [DynamicWebApi]
        public class TestController : IDynamicWebApi
        {
            public string GetHelloWorld()
            {
                return "Hello World !!";
            }
        }
    }
    

      启动Api项目,将会在Swagger上看到该接口,如图:

       (3)在上面的这些步骤,我们完成Controller的解耦,Controller的代码可以写在别的项目了,而主项目只需要添加对该项目的引用即可,在为了方便,我们不能每个接口都去实现IDynamicWebApi标记DynamicWebApi特性,所以我们需要添加一个公共接口来继承和标记该特性,这样别的方法只需要继承即可。同理我们也可能需要每个接口都要有的一些通用的方法,所以我这里还写了一个Api的基类。

     给Controller项目下添加一个Core(存放基类和通用方法的)的文件夹和一个Controllers(存放接口使用的)的文件夹如下所示:

    注:这里的ApiController.xml是在swagger教程里面生成注释文件教程里面自动生成的。具体如何配置生成的请点击。这个注释文件一定要在Controller上配置,这样生成的swaggerApi文档才会有我们写的注释。

       在Core里面添加一个IAppService接口文件和一个AppService类文件 如图所示:

    这里面我扩展了两个在DDD里面比较通用的方法,本来打算用AutoMapper的,由于测试就没去用了,做Domain和Dto之间的映射还是AutoMapper好点(有个缺点是第一次映射还没我下面写的运行速度快,但是多次映射的话AutoMapper的性能还可以)

    IAppService的代码如下

    using Panda.DynamicWebApi;
    using Panda.DynamicWebApi.Attributes;
    using System.Collections.Generic;
    
    namespace Controller.Core
    {
        [DynamicWebApi]
        public interface IAppService : IDynamicWebApi
        {
            /// <summary>
            /// 传入实体内容,转化为对应的Dto
            /// </summary>
            /// <typeparam name="TDto">要转化的Dto类</typeparam>
            /// <param name="entity">传入的实体数据</param>
            /// <returns></returns>
            TDto EntityToDto<TDto>(object entity) where TDto : class, new();
    
    
            /// <summary>
            /// 传入List实体内容,转化为对应的List Dto
            /// </summary>
            /// <typeparam name="TDto"></typeparam>
            /// <param name="entityList">传入的List实体数据</param>
            /// <returns></returns>
            List<TDto> EntityToDto<TDto>(List<object> entityList) where TDto : class, new();
        }
    }
    

    AppService的代码如下

    using AutoMapper;
    using System;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Text;
    
    namespace Controller.Core
    {
        public class AppService : IAppService
        {
    
            public AppService()
            {
            }
    
    
            /// <summary>
            /// 传入实体内容,转化为对应的Dto
            /// </summary>
            /// <typeparam name="TDto">要转化的Dto类</typeparam>
            /// <param name="entity">传入的实体数据</param>
            /// <returns></returns>
            public TDto EntityToDto<TDto>(object entity) where TDto : class, new()
            {
                return Entitytodto<TDto>(entity);
            }
    
    
            /// <summary>
            /// 传入List实体内容,转化为对应的List Dto
            /// </summary>
            /// <typeparam name="TDto"></typeparam>
            /// <param name="entityList">传入的List实体数据</param>
            /// <returns></returns>
            public List<TDto> EntityToDto<TDto>(List<object> entityList) where TDto : class, new()
            {
                List<TDto> list = new List<TDto>();
                foreach (var childObject in entityList)
                {
                    list.Add(Entitytodto<TDto>(childObject));
                }
                return list;
            }
    
            /// <summary>
            /// 传入实体内容,转化为对应的Dto
            /// </summary>
            /// <typeparam name="TDto"></typeparam>
            /// <param name="entity"></param>
            /// <returns></returns>
            private TDto Entitytodto<TDto>(object entity) where TDto : class, new()
            {
                TDto dto = new TDto();
                PropertyInfo[] propertyInfos = entity.GetType().GetProperties();
                PropertyInfo[] dtoproperty = dto.GetType().GetProperties();
                for (int i = 0; i < propertyInfos.Length; i++)
                {
                    for (int j = 0; j < dtoproperty.Length; j++)
                    {
                        if (propertyInfos[i].Name == dtoproperty[j].Name)
                        {
                            dtoproperty[j].SetValue(dto, propertyInfos[i].GetValue(entity));
                            break;
                        }
                    }
                }
                return dto;
            }
        }
    }
    

    之后我们把TestController类移动到Controllers文件夹下 如图:

    并修改代码(这里不需要实现IDynamicWebApi标记DynamicWebApi特性只需要继承我们自己的AppService, IAppService)如下:

    using Controller.Core;
    
    namespace Controller.Controllers.Test
    {
        /// <summary>
        /// 测试类
        /// </summary>
        public class TestAppService : AppService, IAppService
        {
            public string GetHelloWorld()
            {
                return "Hello World !!";
            }
        }
    }
    

    再次运行Api项目你可以看到Swagger上Test接口还是在的,如下:

    到这里Controller从API里解耦出来已经初步经完成。

    github地址:https://github.com/houliren/Asp.netcore-Code-First-DDD

    展开全文
  • 餐厅营业查看系统Java源码ASP.NETCore2.1架构 一个使用ASP.NETCore2.1架构的应用3.0升级概述 在您开始本课程之前,您需要了解一个有趣的事实。 我使用 ASP.NET Core 2.1 版录制了这门课程。 自从我录制了这门课程,...
  • 点我——&gt; ASP.NETCore 安装CentOs .NetCore环境
    展开全文
  • ASP.NetCore2.0入门.pdf

    2018-02-11 10:22:28
    ASP.NetCore2.0入门.pdf ASP.NetCore2.0入门.pdf ASP.NetCore2.0入门.pdf ASP.NetCore2.0入门.pdf ASP.NetCore2.0入门.pdf
  • Asp.NetCore使用Efcore+Mysql实现CodeFirst,并且自动生成EfCore的builderModel的实现过程 主题:Asp.netcore Code First +DDD学习笔记 目录: 【一】 CodeFirst+DDD项目结构的构建 【二】Asp.Netcore使用...

    Asp.NetCore使用Efcore+Mysql实现CodeFirst,并且自动生成EfCore的builderModel的实现过程

    主题:Asp.netcore Code First +DDD学习笔记

    目录:

       【一】 CodeFirst+DDD项目结构的构建

       【二】Asp.Netcore使用Panda.DynamicWebApi来进行Controller解耦

       【三】Asp.NetCore使用Efcore+Mysql实现CodeFirst

       【四】EfCore实现全自动化迁移

         案例代码下载点击

    Domain和数据持久化的实现,Domain和Controller之间的链接本来就是可隔离的,所以直接分开就可以了,通过orm进行对数据的控制和持久化,这里采用Efcore+mysql实现codefirst来进行实现。

    Domain和Efcore之间我们也不能过度耦合,所以这里不采用传统的手写efcontent,这里采用特性和反射来实现自动生成efcontent,链接数据库采用的是Asp mvc依赖注入。

    Domain和Dto之间的映射。

    1、EfModel特性的实现

          在EfCoreRepository项目下添加一个文件夹命名为EfModelAttributes和一个类命名为EfEntityBuilder类、在EfModelAttributes该文件夹下添加一个类命名为EfModelAttribute,如下图:

    EfModelAttribute代码的实现

    using System;
    
    namespace EfCoreRepository.EfModelAttributes
    {
        /// <summary>
        /// EFmodel的实体特性
        /// 作者:猴子 2019-09-19
        /// </summary>
        [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
        public class EfModelAttribute: Attribute
        {
        }
    }
    

    EfEntityBuilder代码的实现

    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Linq;
    using System.Reflection;
    
    namespace EfCoreRepository
    {
        /// <summary>
        /// ef实体的创建
        /// </summary>
        public static class EfEntityBuilder
        {
            /// <summary>
            /// 从程序反射添加实体配置
            /// </summary>
            /// <typeparam name="TAttribute"></typeparam>
            /// <param name="modelBuilder"></param>
            /// <param name="assembly"></param>
            public static void AddEntityConfigurationsFromAssembly<TAttribute>(this ModelBuilder modelBuilder, Assembly assembly)
                where TAttribute : Attribute
            {
                var autoTypes = assembly.GetTypes().Where(x => x.GetCustomAttribute<TAttribute>() != null && x.IsPublic);
                foreach (var entity in autoTypes)
                {
                    modelBuilder.Model.AddEntityType(entity);
                }
                foreach (var entity in modelBuilder.Model.GetEntityTypes())
                {
                    var currentTableName = modelBuilder.Entity(entity.Name).Metadata.Relational().TableName;
                    modelBuilder.Entity(entity.Name).ToTable(currentTableName.ToLower());
                    var properties = entity.GetProperties();
                    foreach (var property in properties)
                        modelBuilder.Entity(entity.Name).Property(property.Name).HasColumnName(property.Name.ToLower());
                }
            }
        }
    }
    

    2、Domain里面的Efcontent的实现

         在Domain这个项目里面添加三个文件夹分别命名为:CoreEntity(存放实体基类的),Domains(存放实体的),EfCoreContent(存放efcorecontent的)。在EfCoreContent下添加一个EfContent类,如下图:

         

    EfContent的代码实现:

    using EfCoreRepository;
    using EfCoreRepository.EfModelAttributes;
    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Reflection;
    
    namespace Domain.EfCoreContent
    {
        public class EfContent : DbContext
        {
            public EfContent(DbContextOptions<EfContent> options) : base(options)
            {
                //部署时需要创建一个数据库实体版本管理表
                //每次需要执行创建迁移命令Add-Migration InitialCreate
                //执行前需要创建该表
    
                //CREATE TABLE `__EFMigrationsHistory` 
                //(
                //    `MigrationId` nvarchar(150) NOT NULL,
                //    `ProductVersion` nvarchar(32) NOT NULL,
                //     PRIMARY KEY(`MigrationId`)
                //);
    
                if (base.Database.GetPendingMigrations().Any())
                {
                    base.Database.Migrate(); //执行迁移
                } 
            }
    
            / <summary>
            / 因为使用无参构造器,所以需要自带链接字符串
            / </summary>
            / <param name="optionsBuilder"></param>
            //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            //{
            //    if (!optionsBuilder.IsConfigured)
            //        optionsBuilder.UseMySQL("Database = 'studyddd'; Data Source = 'localhost'; User Id = 'root'; Password = ''; charset = 'utf8'; pooling = true; Allow Zero Datetime = True;Allow User Variables=True;TreatTinyAsBoolean=false");
            //} 
    
            /// <summary>
            /// 创建实体
            /// </summary>
            /// <param name="modelBuilder"></param>
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.AddEntityConfigurationsFromAssembly<EfModelAttribute>(Assembly.GetExecutingAssembly());
                base.OnModelCreating(modelBuilder);
            }
    
            /// <summary>
            /// 扩展查询
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public IQueryable<T> Where<T>(Expression<Func<T, bool>> predicate) where T : class
            {
                return base.Set<T>().Where(predicate);
            }
        }
    }
    

      3、在Api项目里面注入Efcontent

            在Api的Startup文件里面的ConfigureServices方法添加如下代码

    services.AddDbContextPool<EfContent>(options =>
                    options.UseMySQL("Database = 'studyddd'; Data Source = 'localhost'; User Id = 'root'; Password = ''; charset = 'utf8'; pooling = true; Allow Zero Datetime = True;Allow User Variables=True;TreatTinyAsBoolean=false",b=>b.MigrationsAssembly("Api")), 200);

     这时候,自动生成Efcontent已经完成。

    4、创建一个实体进行测试

     在Domain项目下的Domains文件夹里面创建Tests文件夹,在该文件夹下创建Test类如下

    Test代码实现如下:

    using EfCoreRepository.EfModelAttributes;
    using System.ComponentModel.DataAnnotations;
    
    namespace Domain.Domains.Tests
    {
        /// <summary>
        /// 测试类
        /// </summary>
        [EfModel]
        public class Test 
        {
            [Key]
            public int Id { get; set; }
            public string HelloWorld { get; set; }
        }
    }
    

    注:这里的实体要打上刚刚我们做的EfModel特性,不打特性的不会被自动创建到Efcontent里面。

    5、在Controller里面开始使用Test该实体进行数据存储和访问。

          修改Controller项目里面的TestAppService这个类里面如下

    using Controller.Core;
    using Domain.EfCoreContent;
    using System.Linq;
    
    namespace Controller.Controllers.Test
    {
        /// <summary>
        /// 测试类
        /// </summary>
        public class TestAppService : AppService, IAppService
        {
            public EfContent EfContent { get; set; }
            public TestAppService(EfContent efContent)
            {
                EfContent = efContent;
            }
    
    
            public string GetHelloWorld()
            {
                return "Hello World !!";
            }
    
            /// <summary>
            /// 添加一条测试数据
            /// </summary>
            /// <returns></returns>
            public string AddTest()
            {
                Domain.Domains.Tests.Test test = new Domain.Domains.Tests.Test();
                test.HelloWorld="你好世界";
                EfContent.Add(test);
                EfContent.SaveChanges();
                return "写入成功";
            }
    
            /// <summary>
            /// 获取一条数据
            /// </summary>
            /// <returns></returns>
            public Domain.Domains.Tests.Test GetTest()
            {
                return EfContent.Where<Domain.Domains.Tests.Test>(p => p.HelloWorld == "你好世界").FirstOrDefault(); ;
            }
        }
    }
    

    我实现了一个添加数据的接口,和一个查询数据的接口。

    当然这时候我们还不能之间运行项目开始测试,这时候我们需要到数据库创建一个数据库版本管理表,运行如下sql

    CREATE TABLE `__EFMigrationsHistory` 
    (
      `MigrationId` nvarchar(150) NOT NULL,
      `ProductVersion` nvarchar(32) NOT NULL,
       PRIMARY KEY(`MigrationId`)
    );

    生成表后如图:

     

    之后如果我们实体进行了修改或者调整,需要在【程序包管理控制台里面执行迁移命令】,每次修改或者添加都需要执行创建迁移命令

     Add-Migration InitialCreate

    注:程序包管理器执行命令时,要选择Api项目,如图

    如何打开程序包管理控制台

      

    执行命令成功后,你会发现在Api项目里面多了一个文件夹,如图:

    该文件夹里面的内容不用管他,开始启动项目Api项目,打开swagger你会发现多了两个接口和一个Models,如下图

     

    执行一次添加一条测试数据的接口,你会发现数据库里面自动多了一个test表,如下图

    数据库:

    执行下 查询接口:

    到这里EfCore+Mysql  CodeFirst方式已经实现。

    6、Dto的使用:

         Dto主要作用是控制返回和接入的数据,所以他和别的模块并没有一些很强的交合,主要就是一些实体。我们在Dto里面创建一个testdto如下图

    TestDto的代码实现如下

    namespace Dto.TestDtos
    {
        public class TestDto
        {
            public string HelloWorld { get; set; } 
    
        }
    }
    

    在Controller里面的使用,修改获取一条数据的接口如下:

            /// <summary>
            /// 获取一条数据
            /// </summary>
            /// <returns></returns>
            public Dto.TestDtos.TestDto GetTest()
            {
                return EntityToDto<Dto.TestDtos.TestDto>(EfContent.Where<Domain.Domains.Tests.Test>(p => p.HelloWorld == "你好世界").FirstOrDefault()); 
            }

    这里使用之前在基类里面封装的一个实体到Dto的方法。

    再次运行Api项目,使用Swagger执行 获取一条数据的接口会发现返回的数据Id消失了,如下:

     

    总结:这里我发现该CodeFirst方式,有个美中不足的就是结构迁移,需要执行一下迁移命令,还不能全部代码化,后续需要进行优化,如果有大神有建议和方法,请大神不吝赐教。

    github地址:https://github.com/houliren/Asp.netcore-Code-First-DDD

    展开全文
  • asp.netCore 5.0

    2020-11-13 10:57:10
    asp.netCore5.0 官方文档 .
  • ASP.NETCore5.0官方中文文档.pdf
  • 微软权威的.net core官方教程,方便各位自学.NET core的朋友门查阅与收藏,包含代码部分,中文翻译,学.NET CORE看这本绝对没问题
  • ASP.NetCore2.2

    2019-02-16 11:56:03
    完整版ASP.NetCore2.2中文说明文档API,欢迎大家下载学习
  • asp .netcore 配置框架培训PPT,介绍了配置框架的基本用法以及常用功能。比较基础,适合新手用户学习
  • asp.netCore+vue +SignalR

    2020-12-08 16:07:21
    基于asp.netCore+vue框架实现SignalR实时推送消息功能。协议是webSoket协议
  • ASP.NETCore v5.0.1

    2020-12-28 16:12:01
    为您提供ASP.NETCore下载,ASP.NET Core是一个开放源代码和跨平台框??架,用于构建基于现代云的互联网连接应用程序,例如Web应用程序,IoT应用程序和移动后端。ASP.NET Core应用程序在.NET Core(一个的,跨平台的...
  • CampingRusevi_Asp.NetCore
  • ASP.NETCore编程实现基本认证.pdf
  • ASP.NETCore-API-源码

    2021-02-21 06:12:58
    ASP.NETCore-API
  • asp.netCore3.1微信登录

    2020-12-08 15:31:34
    asp.netCore3.1+微信登录 WechatHelper 是主要代码。第1步:请求code(前端) 第2步:前端通过获取的code请求API获取access_token(第2步之后都是后台API写代码) 第3步:API通过access_token调用接口 第4步:获取...
  • Docker 制作定制asp.netcore 的容器.rar
  • ASP.NETCORE上的项目
  • ASP.NETCore小技巧:使用测试用户中间件.pdf
  • FunProject-WebApi-Asp.netCore
  • Commander_C#_asp.netcore_coreWebApi_webapi.zip
  • 主要为大家详细介绍了Asp.NetCore1.1版本去掉project.json后如何打包生成跨平台包,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • asp.netcore 路由机制分为 约定路由 和 特性路由。本文采用asp.netcore 3.1来演示。 1.约定路由:一般来说,asp.netcore mvc 多数采用约定路由。 asp.netcore mvc 约定路由配置如下: public class Startup {...

    转自:https://www.cnblogs.com/Fengyinyong/p/13721245.html

    asp.netcore 路由机制分为 约定路由 和 特性路由。本文采用asp.netcore 3.1来演示。

    1.约定路由:一般来说,asp.netcore mvc 多数采用约定路由。

    asp.netcore mvc 约定路由配置如下:

    复制代码

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                //提前注入MVC服务
                services.AddControllersWithViews();
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    app.UseHsts();
                }
                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseRouting();
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    //约定路由,需要在 ConfigureServices 方法中提前注入 mvc 服务。
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "{controller=Home}/{action=Index}/{id?}");// 配置默认的路由地址是 home/index
                });
            }
        }

    复制代码

     

    控制器 代码如下:通过约定路由,根据相应的 Controller 和action ,就可以访问。

    复制代码

    public class HomeController : Controller
        {
            private readonly ILogger<HomeController> _logger;
    
            public HomeController(ILogger<HomeController> logger)
            {
                _logger = logger;
            }
    
            public IActionResult Index()
            {
                //return Ok(1);
                //return this.Ok("123");
                //return this.NotFound();
                //return this.File(); //返回文件
                //return this.Content("这里是返回一段文字");
    
                var st = new Student
                {
                    Id = 1,
                    FirstName = "Fyy",
                    LastName = "hehe"
                };
    
                /*最终返回到页面的是Json.
                返回到页面的具体类型,并不是有Controller决定的。Controller 只是把学生的st,放到了 ObjectResult对象中,
                并返回给HTTP请求管道。至于将ObjectResult 以何种形式返回到页面,是由管道的其他环节来处理的。
                */
                /*
                 整个请求的原理:Http请求过来后,经过HTTP请求处理管道,通过路由解析中间件,找到相应的控制器下的Action。Action 处理完逻辑后,
                 将对象St 装入 ObjectResult对象中,并将其返回给HTTP请求处理管道。管道接收到返回的 ObjectResult之后,
                 将其写入(转成)HTTP响应并返回给客户端,此时ObjectResult需要决定需要以Json还是XML或其他格式返回给客户端。
                 */
                return new ObjectResult(st);// 返回json

                  //return new JsonResult(st);//返回json
                  //return Json(st);//返回json MVC特有。

    //return View();//返回的是Index.CSHTML视图
    
                //return View("Student"); //返回的是Student.cshtml视图。需要注入MVC服务。/ Views / Home1 / Student.cshtml
                                        // / Views / Shared / Student.cshtml
            }
    
            public IActionResult Privacy()
            {
                return View();
            }
    
            [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
            public IActionResult Error()
            {
                return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
            }
        }

    复制代码

     

    2.特性路由:restfull api 或者webapi,通常采用特性路由。

    asp.netcore webapi 特性路由配置如下:

    复制代码

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                //webapi 提前注入控制器服务
                services.AddControllers();
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseHttpsRedirection();
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    //需要提前注入控制器服务,才能使用特性路由。
                    endpoints.MapControllers();
                });
            }
        }

    复制代码

     控制器通过加上特性,来配置具体的路由:

    复制代码

    [ApiController]
        [Route("tt/[action]")] //通过tt/action 就能访问 action为具体的方法。
        //[Route("[controller]/[action]")]//通过具体的controller/action 就能访问
        //[Route("tt")]//只指定控制的路由,可在具体方法上再指定action的路由
        public class MyController:ControllerBase
        {
            private readonly ILogger<MyController> _logger;
    
            /// <summary>
            /// 构造函数注入
            /// </summary>
            /// <param name="logger"></param>
            public MyController(ILogger<MyController> logger)
            {
                _logger = logger;
            }
    
            //[Route("")]//相当于不加任何action路由
            //[Route("aa")]
            //[Route("[action]")]//不区分大小写
            [HttpGet]
            public IActionResult GetData()
            {
                return new ObjectResult(new { name="zhangsan", age=12});
            }
        }

    复制代码

     

    展开全文
  • ASP.NETCore_REST_API:完全RESTful的ASP.NET Core Web API
  • Asp.NetCore2.1

    2019-03-12 10:58:32
    NetCore2.1PDF中文文档,分享给对.NETCORE感兴趣的同学
  • MongoDbAccessLayer 带asp.NETCore的Mongo DB访问层
  • Commander_C#_asp.netcore_coreWebApi_webapi_源码.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,781
精华内容 5,112
关键字:

asp.netcore