C#搭建WebApi服务

1,OWIN的介绍

   OWIN 的全称是 "Open Web Interface for .NET", OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口, 其目的是为了实现服务器与应用之间的解耦,使得便携式 .NET Web 应用以及跨平台的愿望成为现实, 标准的 OWIN 应用可以在任何 OWIN 兼容的服务器上运行, 不再依赖于Windows和IIS 。

2,添加NutGet

添加Microsoft.AspNet.WebApi.Owin 和 Microsoft.AspNet.WebApi.Owin Self Host包(Self Host 用于开启OWIN Host,设置监听接受Http请求)

 3,添加Startup类

   Startup是OWIN约定的,用于对OWIN做相关配置的,代码如下:

using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Cors;
namespace WebAPIServer
{
    /// <summary>
    /// Startup是OWIN约定的,用于对OWIN做相关配置
    /// </summary>
    public class Startup
    {
        public void Configuration(IAppBuilder appBuilder)
        {
            try
            {
                HttpConfiguration config = new HttpConfiguration();
                config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
                config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
                //启用路由特性
                config.MapHttpAttributeRoutes();
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional },
                    constraints: new { id = @"\d*" }//新增一个约束,指定id只能是数字,不能是其他
                );
                //再自定义一个路由,第一个路由匹配失败再匹配这个
                config.Routes.MapHttpRoute(
                   name: "ActionApi",
                   routeTemplate: "api/{controller}/{action}/{id}",
                   defaults: new { id = RouteParameter.Optional }
               );
                appBuilder.UseWebApi(config);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}

4,新建Controllers文件夹,添加FileControllers类

    按照 Web API 项目的约定,在项目中添加一个名称为 Controllers 的文件夹,然后新建 一个FileController类,设置其基类为 System.Web.Http.ApiController ,作为示例,其内容与 Visual Studio 自带的 Web API Controller 模板一致,包含4种请求方式(GET/POST/PUT/DELETE),用于演示,重写GET方法(直接返回请求参数)和POST方法(接受实体类参数直接返回),FileController代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using WebAPIServer.Services;
namespace WebAPIServer.Controllers
{
    /// <summary>
    /// 文件类控制器
    /// </summary>
    public class FileController : ApiController
    {
        private string UploadFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFolder");
        private MediaServer _mediaServer = new MediaServer();
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<IHttpActionResult> UploadFolder()
        {
            if (!Request.Content.IsMimeMultipartContent("form-data"))
            {
                return StatusCode(HttpStatusCode.UnsupportedMediaType);
            }
            var provider = new MultipartMemoryStreamProvider();
            await Request.Content.ReadAsMultipartAsync(provider);
            await _mediaServer.UploadFolder(provider, UploadFolderPath);
            // 创建文件夹(如果尚未存在)
            return Ok();
        }
        [HttpGet]
        public async Task<HttpResponseMessage> DownloadFile(string fileName)
        {
            // 获取文件路径
            string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "~/UploadFolder/" + fileName);
            // 检查文件是否存在
            if (!File.Exists(filePath))
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, "The specified file does not exist.");
            }
            // 创建 HTTP 响应消息
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
            // 设置响应内容
            using (FileStream fileStream = File.OpenRead(filePath))
            {
                response.Content = new StreamContent(fileStream);
                // 设置响应头
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = fileName
                };
                await response.Content.LoadIntoBufferAsync();
            }
            return response;
        }
    }
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
namespace WebAPIServer.Services
{
    public class MediaServer
    {
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="provider"></param>
        /// <param name="_uploadFolder"></param>
        /// <returns></returns>
        public async Task UploadFolder(MultipartMemoryStreamProvider provider, string _uploadFolder)
        {
            // 创建文件夹(如果尚未存在)
            Directory.CreateDirectory(_uploadFolder);
            foreach (var content in provider.Contents)
            {
                var disposition = content.Headers.ContentDisposition;
                var fileName = disposition.FileName.Trim('"');
                fileName = Path.GetFileName(fileName);
                var fileData = await content.ReadAsByteArrayAsync();
                // 将文件保存到本地文件夹中
                var filePath = Path.Combine(_uploadFolder, fileName);
                using (var fileStream = new FileStream(filePath, FileMode.Create))
                {
                    await fileStream.WriteAsync(fileData, 0, fileData.Length);
                }
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
namespace WebAPIServer.Controllers
{
    /// <summary>
    /// 验证管理控制器
    /// </summary>
    public class AuthorizationController : ApiController
    {
        // GET api/<controller>
        public string Get()
        {
            return "ok";
        }
        // GET api/<controller>/5
        public string Get(int id)
        {
            return string.Format("owin {0} by:linezero", id);
        }
        /// <summary>
        /// 获取授权码
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        [Route("api/Authorization"), HttpPost] // 自定义路由
        public async Task<HttpResponseMessage> GetAuthorizationCode([FromBody] AuthorizationInfo info)
        {         
            await Task.Run(() =>
            {
                //进行计算并将相应值保存至服务器
                WebAPIOWINServer.AuthorizationInfoRequest?.Invoke(this, info);
            });
            HttpResponseMessage response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
            response.Content = new StringContent($"感谢您的支持,我们将以邮件的形式将授权码发送给您的Email:{info.Email},请注意查收。", Encoding.UTF8);
            return response;
        }
        // PUT api/<controller>/5
        public string Put([FromBody] string value)
        {
            return "Success";
        }
        // DELETE api/<controller>/5
        public string Delete([FromBody] string value)
        {
            return "Success";
        }
    }
    public class AuthorizationInfo
    {
        public string Id { get; set; }
        public string CPUSerialNumber { get; set; }
        public string BIOSSerialNumber { get; set; }
        public string Email { get; set; }
        public DateTime CreateDate { get; set; }
    }
}

5,添加WebApi服务类,代码如下:

using Microsoft.Owin.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using WebAPIServer.Controllers;
namespace WebAPIServer
{
    /// <summary>
    /// WebAPI服务类,提供WebApi服务
    /// </summary>
    public class WebAPIOWINServer 
    {
        static IDisposable webApiObject = null;
        /// <summary>
        /// 开启WebApi服务
        /// </summary>
        /// <param name="ServerUrl">绑定的服务uri</param>
        /// <returns></returns>
        public  bool Start(string ServerUrl)
        {
            try
            {
                //调用Startup启动owin,url需要调用方传入
                webApiObject = WebApp.Start<Startup>(url: ServerUrl);
                HttpClient client = new HttpClient();
                //通过get请求数据,测试owin服务是否正常开启
                Uri uri = new Uri(new Uri(ServerUrl), "api/Authorization/get");                     
                var response = client.GetAsync(uri).Result;
                if (response.IsSuccessStatusCode)
                {
                    return true;
                }
                else
                {
                    webApiObject?.Dispose();
                    throw new Exception("Owin loacal server start failed!");
                }
            }
            catch (Exception)
            {
                webApiObject?.Dispose();
                throw;
            }
        }
        #region 定义应用于webapi接口
        /// <summary>
        /// 请求获取授权码
        /// </summary>
        public static Action<object, Controllers.AuthorizationInfo> AuthorizationInfoRequest;
        #endregion
        /// <summary>
        /// 关闭服务
        /// </summary>
        public void Close()
        {
            webApiObject?.Dispose();
        }
    }
}

6,实例:

效果:

特别注意事项:非管理员权限只用于绑定localhost,若绑定其他地址如:http;//127.0.0.1将抛出“调用目标发生异常”的异常。如果想绑定其他地址请使用管理员权限。

    

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Demo
{
    public partial class Form1 : Form
    {
        WebAPIServer.WebAPIOWINServer server = new WebAPIServer.WebAPIOWINServer();
        public Form1()
        {
            InitializeComponent();
        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "启动服务")
            {
                if (Uri.IsWellFormedUriString(txtIP.Text.Trim(), UriKind.RelativeOrAbsolute))
                {
                    try
                    {
                        if (server.Start(txtIP.Text.Trim()))
                        {
                            SetStatus(true);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
                else
                {
                    MessageBox.Show("网址格式错误");
                }
            }
            else
            {
                server.Close();
                SetStatus(false);
            }
        }
        void SetStatus(bool isOpen)
        {
            if (isOpen)
            {
                btnStart.BackColor = Color.Green;
                btnStart.Text = "停止服务";
                btnStart.ForeColor = Color.Black;
                txtIP.Enabled = false;
            }
            else
            {
                btnStart.BackColor = Color.Red;
                btnStart.Text = "启动服务";
                btnStart.ForeColor = Color.White;
                txtIP.Enabled = true;
            }
        }
    }
}

  API控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
namespace WebAPIServer.Controllers
{
    /// <summary>
    /// 验证管理控制器
    /// </summary>
    public class AuthorizationController : ApiController
    {
        // GET api/<controller>
        public string Get()
        {
            return "ok";
        }
        // GET api/<controller>/5
        public IHttpActionResult Get(int id)
        {
            return Json(new {Method="Get",Value=id });
        }
        /// <summary>
        /// 获取授权码
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        [Route("api/Authorization"), HttpPost] // 自定义路由
        public async Task<HttpResponseMessage> GetAuthorizationCode([FromBody] AuthorizationInfo info)
        {         
            await Task.Run(() =>
            {
                //进行计算并将相应值保存至服务器
                WebAPIOWINServer.AuthorizationInfoRequest?.Invoke(this, info);
            });
            HttpResponseMessage response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
            response.Content = new StringContent($"感谢您的支持,我们将以邮件的形式将授权码发送给您的Email:{info.Email},请注意查收。", Encoding.UTF8);
            return response;
        }
        // PUT api/<controller>/5
        public string Put([FromBody] string value)
        {
            return "Success";
        }
        // DELETE api/<controller>/5
        public string Delete([FromBody] string value)
        {
            return "Success";
        }
    }
    public class AuthorizationInfo
    {
        public string Id { get; set; }
        public string CPUSerialNumber { get; set; }
        public string BIOSSerialNumber { get; set; }
        public string Email { get; set; }
        public DateTime CreateDate { get; set; }
    }
}

  调用WebApi服务时,不仅仅需要引用上述自定义的程序集WebApiServer.dll,还需要再次添加Microsoft.AspNet.WebApi.Owin 和 Microsoft.AspNet.WebApi.Owin Self Host包,否则将报错。

7,WebApiDemo链接。

https://download.csdn.net/download/lingxiao16888/89726657

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 音樂對我來說是一種表達情感和思想的媒介。無論是聆聽音樂還是演奏音樂,都能讓我感受到深深的情感共鳴。 當我聆聽音樂時,我可以完全沉浸在音樂的世界中。音樂可以將我帶入不同的情感狀態,從喜慶到憂愁,從平靜到激動。它可以讓我忘卻現實的壓力和煩惱,帶來一種心靈的寧靜和解脫。同時,不同的音樂風格和流派也能讓我體驗到不同的文化和音樂表達方式。無論是古典音樂、流行音樂還是民族音樂,每一種音樂都有自己獨特的美妙之處。 而當我演奏音樂時,我可以通過樂器發聲來表達自己的情感和思想。我喜歡彈奏鋼琴,因為它能夠表達非常豐富和深入的音樂情感。當我的手指觸摸琴鍵並彈奏出美妙的音樂時,我能夠感受到與樂器的連結和奏鳴的快樂。演奏音樂需要不斷的練習和技巧,但隨著我逐漸掌握和理解音樂的本質,我能夠通過樂器與聽眾分享自己的音樂故事。 總而言之,音樂對我來說是一種無法言喻的表達方式。它能夠觸動我內心深處的情感,讓我感受到生命的美好和豐富。無論是聆聽音樂還是演奏音樂,都是我生活中不可或缺的一部分。 ### 回答2: 对于大多数人来说,C语言是一种广泛应用于计算机科学和编程领域的编程语言。它于1972年由贝尔实验室的Dennis Ritchie开发,并在随后的几十年中被广泛采用。 C语言是一种高效且功能强大的语言。它提供了很多的编程结构和功能,使得开发者可以以更灵活的方式编写代码。C语言也具有高性能和低级别的特性,使得开发者可以更好地控制硬件和内存资源。因此,C语言在嵌入式系统、操作系统和驱动程序等需要高效和低级别控制的应用程序中得到广泛应用。 C语言的语法相对简单,易于学习和理解。它的语法规则清晰明了,没有过多的语法糖和复杂的特性。这使得初学者相对容易上手,并且可以很快编写出可执行的程序。 C语言还被广泛使用是因为它的跨平台性。一次编写的C语言程序可以在各种操作系统和硬件平台上运行,而不需要进行太多的修改。这使得开发者可以更方便地开发和移植应用程序,节省了时间和精力。 总之,C语言是一种广泛应用于计算机科学和编程领域的编程语言,以其高效、功能强大、简单易学和跨平台性而著称,被广大开发者用于各种应用程序的开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值