Asp.Net Core实现最基本的Http服务

news2024/12/23 23:03:09

概述

和.NetFramework时代不同,Core是可以自承载的,也就说开发好的Web项目,可以打包成exe直接运行的,而不必放到IIS这样的环境中。接下来,我们写点代码,体验一下Asp.Net Core自带的Http功能。

初体验

 所谓最小API,在Visual studio中,就一个空的Asp.net Core项目,我们使用向导合建一个项目。

项目向导

 可以看到项目结构非常简单,里边除了项目文件,配置文件,就一个叫做Program.cs代码文件。

项目结构

Program.cs就4行代码,内容如下: 

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

运行效果如下:

这个程序仅输出一行文本。但作为一个产生Web的服务,这已经足够了。因为我们看到网页,实际上就是一个个文本文件,我们只控制好输出内容就行了。我们尝试一下,将上边的Hello world改成HTML内容,是不就可以输出一个网页了?我们修改一下MapGet的参数内容:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "<html><head><title>Hello World!</title><meta charset=\"utf-8\" /></head><body>Hello World!</body></html>");

app.Run();

但运行结果并不如相像中的那样,居然直接将HTML以源码的方式显示在了浏览器中。 

 大概是没有给定ContentType,浏览器这些内容当成普通文本来处理了。查了一下MapGet的文档,发现还有一个重载,这个重载的回调方法中,可以带一个HttpContext的参数。查阅HttpContext的文档,发现这个类里包含所有Http相关的操作,比如通过Response.ContentType 属性来设置响应头,按照这个思路,我们再改下程序。

代码如下: 

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (context) =>
{
    //设置文档内容为html
    context.Response.ContentType = "text/html";
    return context.Response.WriteAsync("<html><head><title>Hello World!</title><meta charset=\"utf-8\" /></head><body>Hello World!</body></html>");
});


app.Run();

 运行起来之后,发现正常了:

注:源代码里的脚本是VS调试时自动附加的内容,在正式Release中是没有的。

 我们再尝试返回其它内容,比如JSON:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (context) =>
{
    context.Response.ContentType = "application/json";
    return context.Response.WriteAsync("{\"title\":\"demo\",\"text\":\"Hello World!\"}");
});

app.Run();

 结果一切正常:

深入HttpContext

从前边的代码体验中,我们发现HttpContext这么个好东西。虽然现代的Web框架想避免直接使用HttpContext,但HttpContext足够简单,可以让我们很容易就能掌握,基本上所有跟Web相关的内容,通过这个对象就可以完全处理。比如我们写可以前端交换的程序,使用HTTP的POST方法,向服务器提交数据,然后结果在提交后的页面中展示出来。我们可以用MapPost方法来接受客户端的POST请求,用Request对象的Form属性获取表单内容。

代码改成如下:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (context) =>
{
    context.Response.ContentType = "text/html";
    return context.Response.WriteAsync("<html><head><title>Hello World!</title><meta charset=\"utf-8\" /></head><body>Hello World!<form method=\"post\"><input name=\"text\"/><button type=\"submit\">提交</button></form></body></html>");
});

app.MapPost("/", (context) =>
{
    string text = context.Request.Form["text"];
    context.Response.ContentType = "application/json";
    return context.Response.WriteAsync("{\"title\":\"demo\",\"text\":\""+ text + "\"}");
});

app.Run();

正如预期的那样,我们在表单里填入“Hi”,提交后,页面的内容变成了“Hi”:

有了上边的经验,后边再处理Url里的查询参数,控制Http头,读写Cookie、Session等就容易多了。我们这里就不再做过多尝试了,应该不难的。

一点思考

对于这种纯静态的内容的,我们可以放到html文件中,但我们不必自己读写文件,只要多加一个方法调用即可:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseStaticFiles();

app.Run();

 然后在项目中添加wwwroot目录,新建一个index.html文件:

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <title>根据覆盖物调整显示范围</title>
  <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
    }
  </style>
</head>

<body>
  <div id="container"></div>
  <div class="input-card" style="width:24rem;">
    <h4>根据覆盖物调整显示范围</h4>
    <div class="input-item">
      <button class="btn" id="fitblue" style="margin-right:1rem;">自适应蓝色标记</button>
      <button class="btn" id="fitall">自适应所有标记</button>
    </div>
  </div>

  <script src="https://webapi.amap.com/maps?v=2.0&key=您申请的key值"></script>
  <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
  <script>
    //创建地图
    var map = new AMap.Map('container', {
      zoom: 10,
      center: [116.405285, 39.904989]
    });

    // 创建两个点标记
    var m1 = new AMap.Marker({
      position: [116.49, 39.9]
    });
    var m2 = new AMap.Marker({
      position: [116.29, 39.9]
    });
    var m3 = new AMap.Marker({
      position: [116.69, 39.9],
      icon: "https://webapi.amap.com/theme/v1.3/markers/n/mark_r.png"
    });

    map.add(m1);
    map.add(m2);
    map.add(m3);

    //自动适配到指定视野范围
    document.querySelector("#fitblue").onclick = function(){
      map.setFitView([m1, m2]);
    }

    //无参数时,自动自适应所有覆盖物
    document.querySelector("#fitall").onclick = function(){
      map.setFitView();
    }
  </script>
</body>

</html>

运行效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式微功耗RTU的功能与特点介绍、技术参数详情

平升电子嵌入式微功耗RTU&#xff0c;可灵活嵌入至各类仪表、传感器和工业设备中&#xff0c;定时采集设备数据并通过4G/5G/NB-IoT远传至监管软件&#xff0c;实现设备联网。 嵌入式微功耗RTU设计小巧、方便集成&#xff0c;微功耗运行&#xff0c;支持标准水资源/水文/环保/M…

Biotin-PEG-AC,Biotin-PEG-Acrylate,生物素PEG丙烯酸酯线性杂双功能PEG试剂

英文名称&#xff1a;Biotin-PEG-AC&#xff0c;Biotin-PEG-Acrylate 中文名称&#xff1a;生物素-聚乙二醇-丙烯酸酯 生物素-聚乙二醇-丙烯酸酯是一种含有生物素和丙烯酸酯的线性杂双功能聚乙二醇试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能与亲和素和…

智创万物,数赢未来——如何助推数智时代的发展浪潮

数智化核心特征 可视化 消费者的行为可以看得见&#xff0c;生产者的行为也可以看得见。产业互联网或者消费互联网非常重要的一点就是要对消费者行为和生产者行为的可视化&#xff0c;其背后是数字化的力量。 可量化 可量化意味着企业家可以对管理流程进行改造&#xff0c;…

echarts的legend——图例样式的配置

认识图例&#xff1a; 以上几张图表中&#xff0c;红色圆圈部分即图例 echarts图表中的图例&#xff0c;有形状&#xff0c;颜色&#xff0c;位置等等各种样式的不同配置。 echarts官网配置项手册里有非常详细的内容&#xff0c;我们挑几种常用的看看&#xff0c;加深对legend属…

深度学习——物体检测算法:R-CNN,SSD,YOLO(笔记)

一&#xff0c;R-CNN 1.区域卷积神经网络R-CNN 首先从输入图像中提取若干个锚框&#xff0c;并标注好它们的类别和偏移量。然后用卷积神经网络对每一个锚框进行前向传播抽取特征。最后用每个提议区域的特征来预测类别和边界框。 ①使用启发式搜索算法来选择锚框 ②使用预训练…

【第一周学习——认识 O(N*logN) 的排序[ 归并排序 、堆排序、快速排序 ]

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;《数据结构与算法》 &#x1f4e7;如果文章知识点有错误的地方&a…

力扣(LeetCode)187. 重复的DNA序列(C++)

哈希表 直观思考&#xff0c;由于限定了答案长度 101010 &#xff0c;只需要一次遍历字符串&#xff0c;统计所有长度为 101010 的子串的出现次数(哈希表) &#xff0c;最后遍历哈希表&#xff0c;维护答案&#xff0c;记录出现 222 次(及以上)的字符串 。 class Solution { …

【BBuf的CUDA笔记】二,解析 OneFlow BatchNorm 相关算子实现

0x1. 前言 在ResNet中&#xff08;https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py&#xff09;&#xff0c;关于BatchNorm的调用一共有两种模式&#xff0c;第一种是ReLU接在BN之后&#xff1a; out self.bn1(out) out self.relu(out)另外一种…

MicFunPred——最新16S rRNA扩增子数据功能预测数据库

近年来&#xff0c;基于扩增子测序进行物种的功能预测是研究微生物群落功能的主要方面&#xff0c;目前最常用的软件包括Tax4Fun以及PICRUSt2。关于这两款软件的使用方法详可参见凌波微课|扩增子研究第十六讲&#xff1a;扩增子测序结果中的物种功能预测。 Tax4Fun使用最近邻匹…

2022年终总结-两年Androider的成长之路

金句分享 生活金句 1.可难道我们生命中做的每一件事不都是为了被爱得更多一点吗 2.这不只是一种对承诺的恐惧&#xff0c;也不是我缺乏关心和爱的能力&#xff0c;因为我做得到&#xff0c;只不过&#xff0c;老老实实讲。我想 我宁愿为了某件我擅长的事&#xff0c;我能表现…

一个select死锁问题

以下代码的输出结果&#xff1a; func main() {var wg sync.WaitGroupfoo : make(chan int)bar : make(chan int)wg.Add(1)go func() {defer wg.Done()select {case foo <- <-bar:default:println("default")}}()wg.Wait() }结果 解析 对于 select 语句&#…

【Linux】进程信号

目录 一、什么是信号 二、信号产生的条件 1、键盘产生 2、进程异常 3、命令产生 4、软件条件 三、信号保存的方式 四、信号处理的方式 1、信号处理接口 2、信号处理时机 3、进程为什么要切换成为用户态才进行信号的捕获方法&#xff1f; 4、sigaction 五、可重入函…

Java+MySQL基于ssm的会议交接平台

随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达,其次就是对任务的安排和执行没有很好的记录,为了改变这些情况,于是我们提…

信贷产品年终总结之贷后逾期分析

自本月月初疫情全面放开后&#xff0c;身边的朋友基本都阳了一遍&#xff0c;希望正在浏览本篇文章的读者您是还没阳过的幸运儿。另外&#xff0c;今天也是冬至了&#xff0c;祝各位读者身边健康&#xff0c;远离羊群&#xff01; 最近我们分享了信贷业务年终总结系列的前2篇文…

Python中转义字符是个啥

文章目录前言一、转义字符是什么&#xff1f;二、常见的转义字符有哪些&#xff1f;总结前言 昨天有粉丝问了我这个代码问题&#xff0c;如下图&#xff1a; 他很好奇代码都没有错误&#xff0c;怎么运行就报错&#xff0c;不知道有咩有小伙伴能看出问题在哪呢&#xff1f; 其…

Cookie 和 Session 的工作流程

文章目录1.Cookie1.什么是Cookie2.Cookie可以干嘛3.Cookie实现登陆逻辑的流程2.session1.session是什么2.session有什么用3.session的工作流程3.Cookie 和 session的区别(重点)1.Cookie 1.什么是Cookie Cookie中存储的是字符串,是浏览器在本地持久化保存数据的一种方案 通过点…

2023春招:Javaweb面试锦囊

cookie 和 session 的区别&#xff1f;&#xff08;必会&#xff09; 存储位置不同 cookie 存放在客户端电脑&#xff0c;是一个磁盘文件。Ie 浏览器是可以从文件夹中找到。session 是存放在服务器内存中的一个对象。 chrome 浏览器进行安全处理&#xff0c;只能通过浏览器找…

圣诞 HTML 代码汇总

文章目录Part.I 音效圣诞树Part.II 圣诞树小球Part.III 简笔圣诞树圣诞节快到了&#xff0c;在网上找了一些 html 代码&#xff0c;觉得挺有意思的&#xff0c;顺带分享一下~ Part.I 音效圣诞树 来源&#xff1a;https://blog.csdn.net/m0_73309780/article/details/128176149…

面临项目失控?四个维度应对项目进度优化【洞见2】

常见的对进度的管理的流程是制定进度目标&#xff0c;WBS工作任务拆解&#xff0c;任务的时间估算&#xff0c;然后执行监督。 有时候这样的过程就会出现的进度延迟&#xff0c;而针对进度的延迟&#xff0c;往往企业多选择是通过加班赶工来完成。 项目进度优化方案 但是如…

【第一章 Linux特点,结构,网路连接模式,Linux目录结构】

第一章 Linux特点&#xff0c;结构&#xff0c;网路连接模式&#xff0c;Linux目录结构 1.操作系统&#xff1a; 用于管理和控制计算机所有软、硬件资源的一组程序。 2. Linux特点总结&#xff1a; ① 开放性&#xff1b; ② 多用户&#xff1b; ③ 多任务&#xff1b; ④ 良好…