当前位置: 首页 > article >正文

.netframwork模拟启动webapi服务并编写对应api接口

在.NET Framework环境中模拟启动Web服务,可以使用几种不同的方法。一个常见的选择是利用HttpListener类来创建一个简单的HTTP服务器,或者使用Owin/Katana库来自托管ASP.NET Web API或MVC应用。下面简要介绍Owin/Katana示例代码。这种方法更加灵活,并且可以让你充分利用ASP.NET的特性和功能,比如模型绑定、过滤器、依赖注入等。同时它也支持通过配置文件进行更复杂的设置。

1.安装依赖包

Microsoft.Owin.Host.HttpListener
Microsoft.AspNet.WebApi.OwinSelfHost(如果你要用到Web API)
在这里插入图片描述
在这里插入图片描述
2.在Program.cs文件中配置web服务

using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Web.Http;

namespace SelfHostedWebApi
{
    class Startup
    {
        // 配置Web API路由和其他设置
        public void Configuration(IAppBuilder appBuilder)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}",
                defaults: new { id = RouteParameter.Optional }
            );
            appBuilder.UseWebApi(config);
        }
    }

    class Program
    {
        static IDisposable _webApp;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // 启动Web API服务
            string baseAddress = "http://*:9005/";
            _webApp = WebApp.Start<Startup>(url: baseAddress);
            Console.WriteLine($"Web API running at {baseAddress}");

            // 启动WinForms应用程序
            Application.Run(new MainForm());
			// 可选:添加其他中间件,例如静态文件支持、跨域资源共享(CORS)等
            // appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            // 停止Web API服务
            //_webApp.Dispose();
        }
    }
}

3.编写webapi服务

这里比如我们去写一个接收文件的api接口,访问时可直接访问http://ip:9005/api/Files/post

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Newtonsoft.Json.Linq; // 引用Newtonsoft.Json库

namespace SelfHostedWebApi.Controllers
{
    public class FilesController : ApiController
    {
        private readonly string _fileStoragePath = @"C:\File";

        // POST api/files
        [HttpPost]
        public async Task<HttpResponseMessage> Post()
        {
            // 检查请求是否包含 multipart/form-data 内容类型
            if (!Request.Content.IsMimeMultipartContent())
            {
                return Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
            }

            try
            {
                var provider = new MultipartMemoryStreamProvider();
                await Request.Content.ReadAsMultipartAsync(provider);

                foreach (var file in provider.Contents)
                {
                    var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
                    var buffer = await file.ReadAsByteArrayAsync();

                    // 判断文件是否为.json格式
                    if (filename.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
                    {
                        // 将字节数组转换为字符串
                        string jsonString = System.Text.Encoding.UTF8.GetString(buffer);

                        // 解析JSON字符串
                        dynamic jsonData = JObject.Parse(jsonString);

                        // 处理接收到的JSON数据
                        string message = $"Received JSON data with key 'name': {jsonData.name}";

                        return Request.CreateResponse(HttpStatusCode.OK, new { Message = message });
                    }
                    else
                    {
                        // 如果不是JSON文件,则保存到本地磁盘
                        if (!Directory.Exists(_fileStoragePath))
                        {
                            Directory.CreateDirectory(_fileStoragePath);
                        }

                        var localFilePath = Path.Combine(_fileStoragePath, filename);
                        File.WriteAllBytes(localFilePath, buffer);

                        return Request.CreateResponse(HttpStatusCode.Created, new { FilePath = localFilePath });
                    }
                }

                return Request.CreateResponse(HttpStatusCode.BadRequest, "No files found.");
            }
            catch (Exception ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
            }
        }
    }
}

http://www.kler.cn/a/508792.html

相关文章:

  • AI 大爆发时代,音视频未来路在何方?
  • Google地图瓦片爬虫
  • Linux操作命令之云计算基础命令
  • 【算法】枚举
  • LLMs之RAG:《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读
  • IEC103 转 ModbusTCP 网关
  • springboot集成websocket实现实时大量数据,效率性能高
  • 【JavaEE进阶】实现简单的加法计算器和用户登录
  • 大模型技术的风险与挑战概述
  • 通过 API 开发实现淘宝链接解析并获取商品详情信息字段
  • Scrapy-Redis分布式爬虫
  • 2024年12月蓝桥杯Scratch12月stema选拔赛真题试卷
  • skywalking的使用
  • 【客观对比】激光雷达 vs 纯视觉方案:汽车自动驾驶的两种路径
  • 服务器迁移MySQL
  • Python爬虫学习前传 —— Python从安装到学会一站式服务
  • python实现批量视频提取音频
  • 深度学习 Pytorch 张量的广播和科学运算
  • RV1126+FFMPEG推流项目(8)AENC音频编码模块
  • 《Opencv》多对象模板匹配
  • Golang—— new() 、 make() 和简短声明符
  • 【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题
  • Linux查看日志命令
  • StyleGaussian: Instant 3D Style Transferwith Gaussian Splatting 论文解读
  • 如何将本地电脑上的文件夹设置为和服务器的共享文件夹
  • 基于Flutter的物联网后台系统