雪剑青春 发表于 2023-8-8 18:39:14

.Net Core WebApi


目录

[*]MiniMalAPi

[*]Demo

[*]Program.cs


[*]Swagger

[*]文档+信息

[*]Program.cs

[*]API版本控制

[*]ApiVersion.cs
[*]Version1Controller.cs
[*]Program.cs

[*]生成注释

[*]解决跨域
[*].Net 后台请求封装
[*]返回数据压缩

[*]默认压缩
[*]Gzip压缩

[*]缓存

[*]接口缓存
[*]静态文件缓存


MiniMalAPi



[*]最小的api, 请求都写在Program.cs中, 可以做微服务
Demo

Program.cs

//基本请求
app.MapGet("/GetTest", () => new { result = "123", code = 200 }).WithTags("General Request");
app.MapPost("/PostTest", () => new { result = "123", code = 200 }).WithTags("General Request");
app.MapPut("/PutTest", () => new { result = "123", code = 200 }).WithTags("General Request");
app.MapDelete("DeletePut", () => new { result = "123", code = 200 }).WithTags("General Request");

//注入
app.MapGet("/GetTestIoc", (IStudent student,IWrite pen) => student.Calligraphy(pen)).WithTags("Ioc");
app.MapGet("/GetTestIocById", (IStudent student,IWrite pen,int? id) => student.Calligraphy(pen)).WithTags("Ioc");
app.MapPost("/GetTestIocByObject", (IStudent student,IWrite pen,Result result) => student.Calligraphy(pen)).WithTags("Ioc");Swagger

文档+信息

Program.cs

builder.Services.AddSwaggerGen(setup =>
{
    setup.SwaggerDoc("V1", new()
    {
      Title = "qfccc",
      Version = "V1",
      Description = "qfccc description",
    });
});

app.UseSwaggerUI(setup =>
{
    setup.SwaggerEndpoint("/swagger/V1/swagger.json", "V1");
});API版本控制



[*]该例子仅供参考
ApiVersion.cs

namespace WebApiDemo.VersionControl
{
    public class ApiVersion
    {
      public static string? Version1;
      public static string? Version2;
      public static string? Version3;
      public static string? Version4;
      public static string? Version5;
    }
}Version1Controller.cs



[*]这里其他版本api 修改ApiVersion.Version1即可
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WebApiDemo.VersionControl;

namespace WebApiDemo.Controllers
{
   
    //api.{nameof(ApiVersion.Version1)}")]
   
    public class Version1Controller : ControllerBase
    {

      
      public IActionResult GetString() => new JsonResult(new { result = "Success" });

      
      public IActionResult PostString() => new JsonResult(new { result = "Success" });

      
      public IActionResult PutString() => new JsonResult(new { result = "Success" });

      
      public IActionResult DeleteString() => new JsonResult(new { result = "Success" });
    }
}Program.cs

builder.Services.AddSwaggerGen(setup =>
{
    foreach (var field in typeof(ApiVersion).GetFields())
    {
      setup.SwaggerDoc(field.Name, new()
      {
            Title = "qfccc",
            Version = field.Name,
            Description = $"qfccc api {field.Name}",
      });
    }
});

app.UseSwaggerUI(setup =>
{
    foreach (var field in typeof(ApiVersion).GetFields())
    {
      setup.SwaggerEndpoint($"/swagger/{field.Name}/swagger.json", field.Name);
    }
});生成注释


[*]项目点击右键 -> 属性 -> 输出 -> 勾选(文档文件)
[*]在AddSwaggerGen中间件添加下方代码
string? basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
if(basePath is not null)
{
    string apiPath = Path.Combine(basePath, "项目名称.xml");
    setup.IncludeXmlComments(apiPath);
}解决跨域


[*]调用方调用自己后台,然后用后台请求目标接口解决跨域
[*]服务器支持跨域请求

[*]在Action中添加这行代码:
[*]HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

[*]使用ActionFilter 实现过滤器,代码与上方一致, 然后在Program.cs 文件中全局注册一下该过滤器,但是不支持Post,Put,Delete这种请求
[*]所有请求都支持跨域可以在Program.cs中增加下方代码:
builder.Services.AddCors( setup =>
{
    setup.AddPolicy("SolveCrossOrigin", policy =>
    {
      policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin();
    });
});


app.UseCors("SolveCrossOrigin");.Net 后台请求封装

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace NET5WebApplication.Utility
{
    public static class HttpClientHelper
    {
      /// <summary>
      /// 发起POST同步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static string HttpPost(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            postData = postData ?? "";
            using (HttpClient client = new System.Net.Http.HttpClient())
            {
                if (headers != null)
                {
                  foreach (var header in headers)
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                }
                using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
                {
                  if (contentType != null)
                        httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
                  HttpResponseMessage response = client.PostAsync(url, httpContent).Result;
                  return response.Content.ReadAsStringAsync().Result;
                }
            }
      }

      /// <summary>
      /// 发起POST异步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static async Task<string> HttpPostAsync(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            postData = postData ?? "";
            using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
            {
                client.Timeout = new TimeSpan(0, 0, timeOut);
                if (headers != null)
                {
                  foreach (var header in headers)
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                }
                using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
                {
                  if (contentType != null)
                        httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);

                  HttpResponseMessage response = await client.PostAsync(url, httpContent);
                  return await response.Content.ReadAsStringAsync();
                }
            }
      }

      /// <summary>
      /// 发起GET同步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static string HttpGet(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            using (HttpClient client = new HttpClient())
            {
                if (contentType != null)
                  client.DefaultRequestHeaders.Add("ContentType", contentType);
                if (headers != null)
                {
                  foreach (var header in headers)
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                }
                HttpResponseMessage response = client.GetAsync(url).Result;
                return response.Content.ReadAsStringAsync().Result;
            }
      }

      /// <summary>
      /// 发起GET异步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static async Task<string> HttpGetAsync(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
            {
                if (contentType != null)
                  client.DefaultRequestHeaders.Add("ContentType", contentType);
                if (headers != null)
                {
                  foreach (var header in headers)
                        client.DefaultRequestHeaders.Add(header.Key, header.Value);
                }
                HttpResponseMessage response = await client.GetAsync(url);
                return await response.Content.ReadAsStringAsync();
            }
      }

      /// <summary>
      /// 发起POST同步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static T HttpPost<T>(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            return HttpPost(url, postData, contentType, timeOut, headers).ToEntity<T>();
      }

      /// <summary>
      /// 发起POST异步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static async Task<T> HttpPostAsync<T>(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            var res = await HttpPostAsync(url, postData, contentType, timeOut, headers);
            return res.ToEntity<T>();
      }

      /// <summary>
      /// 发起GET同步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static T HttpGet<T>(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            return HttpGet(url, contentType, headers).ToEntity<T>();
      }

      /// <summary>
      /// 发起GET异步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static async Task<T> HttpGetAsync<T>(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            var res = await HttpGetAsync(url, contentType, headers);
            return res.ToEntity<T>();
      }
    }

    public static class HttpExtension
    {
      /// <summary>
      /// 发起GET同步请求
      /// </summary>
      /// <param name="client"></param>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static string HttpGet(this System.Net.Http.HttpClient client, string url, string contentType = "application/json",
                                     Dictionary<string, string> headers = null)
      {
            if (contentType != null)
                client.DefaultRequestHeaders.Add("ContentType", contentType);
            if (headers != null)
            {
                foreach (var header in headers)
                  client.DefaultRequestHeaders.Add(header.Key, header.Value);
            }
            HttpResponseMessage response = client.GetAsync(url).Result;
            return response.Content.ReadAsStringAsync().Result;
      }

      /// <summary>
      /// 发起GET异步请求
      /// </summary>
      /// <param name="client"></param>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static async Task<string> HttpGetAsync(this System.Net.Http.HttpClient client, string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            if (contentType != null)
                client.DefaultRequestHeaders.Add("ContentType", contentType);
            if (headers != null)
            {
                foreach (var header in headers)
                  client.DefaultRequestHeaders.Add(header.Key, header.Value);
            }
            HttpResponseMessage response = await client.GetAsync(url);
            return await response.Content.ReadAsStringAsync();
      }

      /// <summary>
      /// 发起POST同步请求
      /// </summary>
      /// <param name="client"></param>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="timeOut"></param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static string HttpPost(this System.Net.Http.HttpClient client, string url, string postData = null,
                                    string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            postData = postData ?? "";
            if (headers != null)
            {
                foreach (var header in headers)
                  client.DefaultRequestHeaders.Add(header.Key, header.Value);
            }
            using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
            {
                if (contentType != null)
                  httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);

                HttpResponseMessage response = client.PostAsync(url, httpContent).Result;
                return response.Content.ReadAsStringAsync().Result;
            }
      }

      /// <summary>
      /// 发起POST异步请求
      /// </summary>
      /// <param name="client"></param>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static async Task<string> HttpPostAsync(this System.Net.Http.HttpClient client, string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            postData = postData ?? "";
            client.Timeout = new TimeSpan(0, 0, timeOut);
            if (headers != null)
            {
                foreach (var header in headers)
                  client.DefaultRequestHeaders.Add(header.Key, header.Value);
            }
            using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
            {
                if (contentType != null)
                  httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);

                HttpResponseMessage response = await client.PostAsync(url, httpContent);
                return await response.Content.ReadAsStringAsync();
            }
      }

      /// <summary>
      /// 发起POST同步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static T HttpPost<T>(this System.Net.Http.HttpClient client, string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            return client.HttpPost(url, postData, contentType, timeOut, headers).ToEntity<T>();
      }

      /// <summary>
      /// 发起POST异步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="postData"></param>
      /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
      /// <param name="headers">填充消息头</param>
      /// <returns></returns>
      public static async Task<T> HttpPostAsync<T>(this System.Net.Http.HttpClient client, string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
      {
            var res = await client.HttpPostAsync(url, postData, contentType, timeOut, headers);
            return res.ToEntity<T>();
      }

      /// <summary>
      /// 发起GET同步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static T HttpGet<T>(this System.Net.Http.HttpClient client, string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            return client.HttpGet(url, contentType, headers).ToEntity<T>();
      }

      /// <summary>
      /// 发起GET异步请求
      /// </summary>
      /// <param name="url"></param>
      /// <param name="headers"></param>
      /// <param name="contentType"></param>
      /// <returns></returns>
      public static async Task<T> HttpGetAsync<T>(this System.Net.Http.HttpClient client, string url, string contentType = "application/json", Dictionary<string, string> headers = null)
      {
            var res = await client.HttpGetAsync(url, contentType, headers);
            return res.ToEntity<T>();
      }
    }

    public static class JsonExtends
    {
      public static T ToEntity<T>(this string val)
      {
            return JsonConvert.DeserializeObject<T>(val);
      }
      public static string ToJson<T>(this T entity, Formatting formatting = Formatting.None)
      {
            return JsonConvert.SerializeObject(entity, formatting);
      }
    }
}返回数据压缩



[*]在Program.cs中添加下面代码
默认压缩

builder.Services.AddResponseCompression();
app.UseResponseCompression();Gzip压缩

builder.Services.AddResponseCompression(config =>
{
    config.Providers.Add<GzipCompressionProvider>();
});

builder.Services.Configure<GzipCompressionProviderOptions>(config =>
{
    config.Level = CompressionLevel.SmallestSize;
});缓存

接口缓存



[*]使用特性或者直接在返回头中添加Cache-Control效果一样


public IActionResult GetString() => new JsonResult(new { result = "Success" });


public IActionResult GetStringEx()
{
    HttpContext.Response.Headers.Add("Cache-Control", "public,max-age=600");
    return new JsonResult(new { result = "Success" });
}静态文件缓存

app.UseStaticFiles(new StaticFileOptions()
{
    OnPrepareResponse = Prepare =>
    {
      Prepare.Context.Response.Headers.Add(HeaderNames.CacheControl, "public,max-age=600");
    }
});
来源:https://www.cnblogs.com/qfccc/archive/2023/08/08/17615157.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .Net Core WebApi