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.pswp.cn/web/65729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65729.shtml
英文地址,請注明出處:http://en.pswp.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…