C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序

创建BridgeApi

第二步,运行将生成默认的示例网页,网页Url为

https://localhost:44361/home/index

右键 项目 添加 WebAPI控制器类

 添加 

我们可以看到App_Start目录下 有三个文件:

BundleConfig.cs代表 捆绑文件的引用 

有脚本文件ScriptBundle的引用(javascript文件,后缀名.js)

和层叠样式表文件StyleBundle(即css网页排版文件,后缀名.css)

FilterConfig.cs代表全局筛选器

RouteConfig.cs代表url路由模式和action信息

右键,项目,将类库项目更新为控制台应用程序,并添加类Program

添加开源框架Topshelf的引用,添加Owin框架的引用

Topshelf 框架

Topshelf 是一个开源的跨平台的宿主服务框架,支持 Windows 和 Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

使用 Topshelf 可以非常方便的将一个 C# 控制台程序部署成为一个 Windows Service, 使用它可以很方便的构建跨平台服务寄主,而在调试时直接以控制台的形式运行即可,非常方便。

Owin框架

OWIN 允许 Web 应用从 Web 服务器分离。 它定义了在管道中使用中间件来处理请求和相关响应的标准方法。 WebAPI应用程序和中间件可以与基于 OWIN 的应用程序、服务器和中间件进行互操作。

我们在web.config(有些是app.config)增加webAPI地址和端口

ApiAddress和ApiPort

<?xml version="1.0" encoding="utf-8"?>
<!--有关如何配置 ASP.NET 应用程序的详细信息,请访问https://go.microsoft.com/fwlink/?LinkId=301880-->
<configuration><appSettings><add key="webpages:Version" value="3.0.0.0" /><add key="webpages:Enabled" value="false" /><add key="ClientValidationEnabled" value="true" /><add key="UnobtrusiveJavaScriptEnabled" value="true" /><add key="ApiAddress" value="" /><add key="ApiPort" value="45678" /></appSettings>
</configuration>

Program.cs如下:

using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Topshelf;
using Topshelf.HostConfigurators;
/*
* Topshelf 是一个开源的跨平台的宿主服务框架,支持 Windows 和 Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。
* 使用 Topshelf 可以非常方便的将一个 C# 控制台程序部署成为一个 Windows Service, 使用它可以很方便的构建跨平台服务寄主,
* 而在调试时直接以控制台的形式运行即可,非常方便。
* Owin框架
* OWIN 允许 Web 应用从 Web 服务器分离。 它定义了在管道中使用中间件来处理请求和相关响应的标准方法。 
* WebAPI应用程序和中间件可以与基于 OWIN 的应用程序、服务器和中间件进行互操作。
*/namespace BridgeApi
{public class Program{static void Main(string[] args){Console.WriteLine("WebAPI程序启动开始...");HostFactory.Run(new Action<HostConfigurator>(HostConf));Console.ReadLine();}public static void HostConf(HostConfigurator hostConfigurator){// 服务使用NETWORK_SERVICE内置帐户运行。身份标识,有好几种方式,如:x.RunAs("username", "password");  x.RunAsPrompt(); x.RunAsNetworkService(); 等hostConfigurator.RunAsLocalService();//以服务//x.StartAutomatically();//StartModeExtensions//x.StartManually();//手动模式hostConfigurator.SetDescription("WebAPIServer 斯内科 Topshelf Host服务的描述"); //安装服务后,服务的描述hostConfigurator.SetDisplayName("WebAPIServerSnake"); //显示名称hostConfigurator.SetServiceName("WebAPIServerSnake"); //服务名称Type t = hostConfigurator.GetType();//Topshelf.HostConfigurators.HostConfiguratorImplConsole.WriteLine(t.ToString());hostConfigurator.Service<TownCrier>(s =>{s.ConstructUsing(name => new TownCrier());     //配置一个完全定制的服务,对Topshelf没有依赖关系。常用的方式。//the start and stop methods for the services.WhenStarted(tc => tc.Start());              //4s.WhenStopped(tc => tc.Stop());});}        }public class TownCrier{public TownCrier(){}public void Start(){Task.Factory.StartNew(() =>{bool IsStarted = false;while (!IsStarted){try{string log = "服务启动成功。";string urlKey = "ApiAddress";string portKey = "ApiPort";if (!ConfigurationManager.AppSettings.AllKeys.Contains(urlKey)){log = $"服务启动出现异常:App.config文件中不存在配置[{urlKey}]";Console.WriteLine(log);return;}if (!ConfigurationManager.AppSettings.AllKeys.Contains(portKey)){log = $"服务启动出现异常:App.config文件中不存在配置[{portKey}]";Console.WriteLine(log);return;}string apiUrl = ConfigurationManager.AppSettings[urlKey].ToString();string apiPort = ConfigurationManager.AppSettings[portKey].ToString();bool rtn = int.TryParse(apiPort, out int port);if (!rtn){log = $"服务启动出现异常:App.config文件中配置[{portKey}]值错误";Console.WriteLine(log);return;}StartOptions options = new StartOptions();//options.Urls.Add($"http://localhost:{apiPort}");options.Urls.Add($"http://127.0.0.1:{apiPort}");//options.Urls.Add($"http://{Environment.MachineName}:{apiPort}");if (!string.IsNullOrEmpty(apiUrl)){options.Urls.Add($"http://{apiUrl}:{apiPort}");}else{#region //自动绑定所有IPstring hostName = Dns.GetHostName();IPAddress[] iPAddresses = Dns.GetHostAddresses(hostName);foreach (IPAddress ipAddress in iPAddresses){//IPv4if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork){options.Urls.Add($"http://{ipAddress}:{apiPort}");}}#endregion}string urls = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(options.Urls);log = $"开始启动服务,服务地址:{urls}";Console.WriteLine(log);//OWIN 托管服务器问题:StartOptions WebApp.Start TargetInvocationException// Start OWIN host ,启动一个webapi程序//  public static IDisposable Start(string url, Action<IAppBuilder> startup);WebApp.Start(options, startup: Configuration);Console.WriteLine($"服务启动成功。");IsStarted = true;}catch (Exception ex){Console.WriteLine($"服务启动出现异常:{ex.Message}");Thread.Sleep(2000);}}});}public void Stop(){Console.WriteLine($"WebApi服务退出");}public void Configuration(IAppBuilder appBuilder){// Configure Web API for self-host. HttpConfiguration config = new HttpConfiguration();config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });appBuilder.UseWebApi(config);}}
}

 控制器类BridgeController如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;namespace BridgeApi
{[RoutePrefix("Bridge")]public class BridgeController : ApiController{/// <summary>/// 测试API端口,假设传入一个json字符串{"TestName":"斯内科"}/// 请求路由Url不区分大小写/// http://127.0.0.1:45678/Bridge/testApi/// </summary>/// <param name="json"></param>/// <returns></returns>[Route("TestApi")][HttpPost]public HttpResponseMessage TestApi(object objText) {try{Microsoft.Owin.OwinContext context = ((Microsoft.Owin.OwinContext)Request.Properties["MS_OwinContext"]);string RemoteClient = context.Request.RemoteIpAddress + ":" + context.Request.RemotePort;if (objText == null){string returnDataNG = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = 12345,Message = $"解析失败,请求参数为空,源文本【{objText}】"});return new HttpResponseMessage(){Content = new StringContent(returnDataNG, System.Text.Encoding.UTF8, mediaType: "application/json")};}string json = objText.ToString();TestClass testClass = Newtonsoft.Json.JsonConvert.DeserializeObject<TestClass>(json);if (testClass == null || string.IsNullOrEmpty(testClass.TestName)){string returnDataNG = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = 12345,Message = $"解析失败,TestName为空,源json【{json}】"});return new HttpResponseMessage(){Content = new StringContent(returnDataNG, System.Text.Encoding.UTF8, mediaType: "application/json")};}string returnData = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = 0,Message = "",Data = $"接收到【{RemoteClient}】上抛数据【{json}】,已处理OK,返回一个随机数【{new Random().Next(1, 100)}】"});return new HttpResponseMessage(){Content = new StringContent(returnData, System.Text.Encoding.UTF8, mediaType: "application/json")};}catch (Exception ex) {string returnDataNG = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = -1,Message = $"处理时出现错误【{ex.Message}】"});return new HttpResponseMessage(){Content = new StringContent(returnDataNG, System.Text.Encoding.UTF8, mediaType: "application/json"),StatusCode = HttpStatusCode.BadRequest};}}}public class TestClass{public string TestName { get; set; }}/// <summary>/// 接口反馈的响应内容对象/// </summary>public class ResponseContent {/// <summary>/// 错误号,code为0代表OK/// </summary>public int Code { get; set; }/// <summary>/// 错误描述,Code为0,这里显示空/// </summary>public string Message { get; set; }/// <summary>/// 相关数据信息,该Data可以是数组、键值对字典、字符串等任意类型数据/// </summary>public object Data { get; set; }}
}

运行,将其按照服务进行

使用PostMan测试WebApi 接口,如下

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

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

相关文章

wordpress 房产网站筛选功能

自定义分类法创建 add_action( init, ashu_post_type ); function ashu_post_type() {register_taxonomy(province,post,array(label => 省,rewrite => array( slug => province ),hierarchical => true));register_taxonomy(city,post,array(label => 市,rewr…

hive迁移后修复分区慢,怎么办?

我有1个30TB的分区表&#xff0c;客户给的带宽只有600MB&#xff0c;按照150%的耗时来算&#xff0c;大概要迁移17小时。 使用hive自带的修复分区命令&#xff08;一般修复分区比迁移时间长一点&#xff09;&#xff0c;可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…

慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(一)

通过左侧导航菜单〖业务建模〗→〖业务对象〗&#xff0c;进入该界面&#xff1b;在该界面可以查看到系统中已存在的业务对象&#xff1b; 1.新建业务对象 在DatalinkX中进入【业务建模】的【业务对象】页面&#xff0c;点击【新建】按钮进入新建页面&#xff1b; 新建页面左侧…

Linux系统之hostname相关命令基本使用

Linux系统之hostname相关命令基本使用 一、检查本地系统版本二、hostname命令的帮助说明中文帮助说明 三、hostname命令的基本使用1. 查看计算机名2. 查看本机上所有IP地址3. 查看主机FQDN4. 查看短主机名 四、hostnamectl命令的使用1. 查看主机详细信息2. 设置主机名3. hostna…

DC系列靶场渗透--DC-3

目录 环境搭建 开始渗透 扫存活 扫端口 扫服务 查看80端口 尝试在80端口中的登陆页面寻找sql注入失败 扫目录 进入/htaccess.txt目录看一下 我们尝试找一下Joomla3.7.0版本的漏洞 我们尝试利用该漏洞 查数据库名 查表名 查列名 查数据 找到密码的可能的编码方式…

js代理模式

允许在不改变原始对象的情况下&#xff0c;通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后&#xff0c;添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件&#xff0c;某个表单需求&#xff0c;单位性质字段如果是高校&#xff0c;那么工作单位则是高校的下拉选择格式&#xff0c;单位性质如果是其他的类型&#xff0c;工作单位则是手动…

深度学习知识点:RNN

文章目录 1.简单介绍2.网络结构3.应对梯度消失 1.简单介绍 循环神经网络&#xff08;RNN&#xff0c;Recurrent Neural Network&#xff09;是一类用于处理序列数据的神经网络。与传统网络相比&#xff0c;变化不是特别大&#xff0c;不如CNN的变化那么大。 为什么要有循环神经…

(leetcode算法题)287. 寻找重复数(经典题目,二分解法)

如果一个题目限定了数据范围是[1, n]内的整数&#xff0c;那么这个题目可以思考的就是 nums[i]和 i 的关系&#xff0c;769. 最多能完成排序的块 这个题就使用到了子数组中最大值和 连续[0, n - 1]的关系 而对于本题来说&#xff0c;也可以思考[1, n] 和 nums[i] 的关系&…

获得PostgreSQL中级认证后,可以从事哪些工作岗位?

获得 PostgreSQL 中级认证后&#xff0c;可以获得的岗位 数据库管理类 数据库管理员&#xff08;DBA&#xff09;&#xff1a;负责 PostgreSQL 数据库的日常维护、监控、备份与恢复、性能优化、安全管理等工作。确保数据库的稳定运行和数据的安全性、完整性&#xff0c;及时处理…

4.1、二纤单向、二纤双向、四纤双向,网络级保护

1、线性复用段保护&#xff08;LMSP&#xff09; 就像是给网络业务传输准备的一个 “保险”。在 SDH 和 MSTP 网络里&#xff0c;业务信号要通过一段一段的路&#xff08;复用段&#xff09;来传输&#xff0c;LMSP 就是为了保证这些路出问题的时候&#xff0c;业务还能正常走。…

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功

【spark源码修改】hive3.1.3 spark3.5.4编译,需要修改源码,最终编译成功 1. 准备安装包与maven编译环境1.1 安装环境准备1.2 修改pom1.3 打包命令2. 编译与问题解决2.1 开始编译 失败, 缺包pentaho-aggdesigner-algorithm:pom:5.1.5-jhyde2.2 Hive Spark Remote Client 模块…

SQL-leetcode-584. 寻找用户推荐人

584. 寻找用户推荐人 表: Customer -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | referee_id | int | -------------------- 在 SQL 中&#xff0c;id 是该表的主键列。 该表的每一行表示一个客户的 id、姓名以及推…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据&#xff1a;描述事物的符号记录 数据库&#xff08;DB&#xff09;&#xff1a;长期存储在计算机内的、…

Scala语言的面向对象编程

Scala语言的面向对象编程 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来组织代码&#xff0c;这些对象能够包含数据&#xff08;属性&#xff09;以及功能&#xff08;方法&#xff09;。Scala…

【JVM-2.1】如何使用JMC监控工具:详细步骤与实战指南

Java Mission Control&#xff08;JMC&#xff09;是Oracle提供的一个高级图形化监控工具&#xff0c;专为Java应用程序的性能分析和故障排查设计。JMC不仅提供了实时监控功能&#xff0c;还支持飞行记录器&#xff08;Flight Recorder&#xff09;功能&#xff0c;能够记录JVM…

QT c++ 样式 设置 标签(QLabel)的渐变色美化

上一篇文章中描述了按钮的纯色&#xff0c;本文描述标签的渐变色美化。 1.头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h"#include <QVBoxLayout> #include <QLinearGradient> #include <QLabel…

设计模式 行为型 观察者模式(Observer Pattern)与 常见技术框架应用 解析

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新。 一…

03_Redis基本操作

1.Redis查询命令 1.1 官网命查询命令 为了便于学习Redis,官方将其用于操作不同数据类型的命令进行了分类整理。你可以通过访问Redis官方网站上的命令参考页面https://redis.io/commands来查阅这些分组的命令,这有助于更系统地理解和使用Redis的各项功能。 1.2 HELP查询命令…

system securiry: supervisor password required

报错解释&#xff1a; 这个错误表明系统安全模块&#xff08;如SELinux或AppArmor&#xff09;需要超级用户&#xff08;通常是root&#xff09;的密码来确认一个操作。这通常发生在尝试进行某些需要高级权限的系统更改时。 解决方法&#xff1a; 如果你拥有root权限&#xff0…