


Asp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API)
Einführung
ApiAls Anbieter von Geschäftslogik trägt es die Kernlogik des Projekts und weist daher eine relativ hohe Logikkomplexität auf. Unter einer solchen Prämisse geht es darum, wie man das Schreiben von Code vereinfacht, wie man den Schreibstil und die Logikspezifikationen standardisiert und vereinheitlicht und wie man die Wartbarkeit und Skalierbarkeit des Codes verbessert. Es wird wichtig, Projekte mit hoher Kohäsion und geringer Kopplung aufzubauen.
Das Beispiel ist ein Projekt auf Unternehmensebene. Das Framework ist wie unten gezeigt
api layer.jpg
Sicherheit: Die HTTP-Anfrage (Override DelegatingHandler) wird neu geschrieben, die Rechtmäßigkeit wird in den Aspekten der Anfrage beurteilt und die Signaturanforderungen werden vorverarbeitet.
Client: Definiert eine einheitliche Schnittstelle-Aufrufmethode, die vom aufrufenden Ende verwendet wird, wodurch die Verwendung der Schnittstelle vereinfacht und vereinheitlicht wird.
Strg-Ebene: Als direkter Anbieter von Diensten stellt er direkt eine dem RestFul-Stil ähnliche Schnittstelle auf dem Server bereit (es fühlt sich streng im RestFul-Stil an, der ein vollständiges Domänen-ModellTreiber , die tatsächliche Situation ist immer unbefriedigend und die Domänenabstraktionsfähigkeit reicht nicht aus), rufen Sie die Anforderungsdaten ab, rufen Sie nach Bedarf FilterFilter auf, treffen Sie weitere Beurteilungen und rufen Sie
Modell Schicht: Als Geschäftsmodellschicht stellt sie den eigentlichen Betrieb der Geschäftslogik bereit. Verwenden Sie ein einheitliches Entitätsmodell und verbinden Sie es für Datenoperationen mit Ibatis. Die spezifische Codestruktur ist wie folgt:
Api-UML.jpg
Das Folgende ist eine detaillierte Einführung von jedes Modul und Codebeispiel:
Entitätsbibliotheksprojektcodebeispiel
Die Projektstruktur ist wie folgt:
Entität. jpg
Do
mainModul, als Entitätsmodell lautet der einfache Code wie folgt
Request, das Anforderungsstrukturmodell, verwendet die generische Schnittstelle zum Herstellen einer Verbindung Die Anforderungsklasse und die Rückgabeklasse, die eine Rolle spielen, steuern den Effekt der Inversion.public class User { public int Id { get; set; } public string NickName { get; set; } public string Avatar { get; set; } }Das Antwortmodul definiert als Rückgabetyp der Anfrage eine einheitliche Rückgabestruktur, um Verbrauchern die Beurteilung und Verarbeitung konsistenter Rückgabecodes zu erleichtern.
public abstract class AbstractRequest { public bool ValidateParameters() { //公用方法示例,验证参数合法性 } } public interface IRequest<t> where T:AbstractResponse { //获取接口名称 string GetApiName(); //获取接口编码 string GetApiCode(); } //获取User信息的请求结构定义 public class GetUserRequest:AbstractRequest,IRequest<getuserresponse> { public int Id { get; set; } public string GetApiName() { return "User.GetUserDetail"; } public string GetApiCode() { return "User001"; } }</getuserresponse></t>Codebeispiel für ein Serviceprojekt
public abstract class AbstractResponse { //返回码 public int Code { get; set; } //报错信息 public string Message { get; set; } } public class GetUserResponse:AbstractResponse { public User User { get; set; } }
Die Projektstruktur ist wie folgt:
service.jpg
Codebeispiel:
Sicherheitpublic interface IUserService { GetUserResponse GetUser(int id); } public class BaseService { //protected SqlInstance sqlInstance; public BaseService() { //sqlInstance=new SqlInstance(); //实例化数据库连接 //... } //... } public class UserService:BaseService,IUserService { public GetUserResponse GetUser(int id) { //链接数据库获取数据 //... throw new NotImplementedException(); } }Klassenbibliothek
CodebeispielDie Klassenbibliothek behandelt nur das Problem
Sicherheit beim API-Anfrageeintrag Erlaubnisurteil hinzufügen. Verwenden Sie die Methode zum Umschreiben von HTTP-Anfragen. Codebeispiel
public class MyHandler : DelegatingHandler { protected async override Task<httpresponsemessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { IEnumerable<string> keyEnumerable; var t1 = request.Headers.TryGetValues("key", out keyEnumerable); var key = keyEnumerable.FirstOrDefault(); if (!true)//验证类似于token的权限 { return await Task.Factory.StartNew<httpresponsemessage>( () => new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("error message") }); } //如果有signature,判断,并加结果标志,没有的话,清除signature相关信息,防止伪造。 //..... return await base.SendAsync(request, cancellationToken); } }</httpresponsemessage></string></httpresponsemessage>Routing
-Konfigurationscode hinzugefügt werden. WebApi-Projektbeispiel
Als eigentliche Definition der Schnittstelle definiert Webapi die tatsächlichen Regeln der Schnittstellendatei und führt die entsprechende
Sicherheitsverwaltungund Berechtigungskontrolle der Schnittstelle durch . Um die Berechtigungssteuerung von WeChat zu erlernen, wurden mehrere Schnittstellen grob bestimmt:
Schnittstellenberechtigungen.png
Codebeispiel:
public class UserController : ApiController { private IUserService userService; public UserController() { userService=new UserService(); } [Signature]//安全签名过滤器判断 [HttpPost] public GetUserResponse GetUser(GetUserRequest request) { //参数判断,安全性判断等等 var ret = userService.GetUser(request.Id); return ret; } }Codebeispiel für die Client-Klassenbibliothek
public static void Register(HttpConfiguration config) { // Web API configuration and services // Configure Web API to use only bearer token authentication. config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}", defaults: new { id = RouteParameter.Optional } ); //添加的代码,添加http请求的入口处理 config.MessageHandlers.Add(new MyHandler()); }
Die Client-Klassenbibliothek definiert die von der Schnittstelle aufgerufenen öffentlichen Methoden.
1. Verwenden Sie generische Schnittstellen, um die Anforderungsklasse und die Rückgabeklasse zu kapseln, um das Schreiben des aufrufenden Codes zu vereinfachen.2. Es ermöglicht Verbrauchern auch, Schnittstellen über Proxy-Klassen aufzurufen, wodurch domänenübergreifende Probleme vermieden werden.
3. Alle Verbraucheraufrufe stimmen der Verwendung einer einheitlichen Klassenbibliothek zu, sodass die Protokollverarbeitung einheitlich ist und auch die zurückgegebenen Fehler konsistent definiert werden können.
Das Codebeispiel lautet wie folgt:
public interface IClient { T Execute<t>(IRequest<t> request) where T : AbstractResponse; } public class DefaultClient:IClient { private readonly string appKey; private readonly string appSecret; private readonly string baseUrl = "http://localhost:16469/api/"; private readonly bool isNeedLogFile = false; private readonly LogFile logFile; public static readonly string SecureHeaderAppKey = "secure_head_appkey"; public static readonly string SecureHeaderSignature = "secure_head_signature"; public DefaultClient() { baseUrl = ConfigurationManager.AppSettings["service_base_url"]; appKey = ConfigurationManager.AppSettings["app_key"]; appSecret = ConfigurationManager.AppSettings["app_secret"]; isNeedLogFile = "1".Equals(ConfigurationManager.AppSettings["client_log_file"]); logFile = new LogFile("client_log_path"); logFile.SubPath = appKey; } public DefaultClient(string serviceBase, string code, string key) { baseUrl = serviceBase; appKey = code; appSecret = key; } public T Execute<t>(IRequest<t> request) where T : AbstractResponse { var webRequest = (HttpWebRequest)WebRequest.Create(baseUrl + request.GetApiName()); webRequest.Method = "POST"; string reqJson; string sign; using (Stream rs = webRequest.GetRequestStream()) { reqJson = JsonConvert.SerializeObject(request); byte[] reqBytes = Encoding.UTF8.GetBytes(reqJson); rs.Write(reqBytes, 0, reqBytes.Length); rs.Close(); } webRequest.ContentType = "application/json"; webRequest.Headers.Add(SecureHeaderAppKey, appKey); sign = ComputeHash(appKey, appSecret, reqJson); webRequest.Headers.Add(SecureHeaderSignature, sign); //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 请求内容: {1}", request.GetApiCode(), reqJson)); logFile.Log(string.Format("[{0}] 请求签名: {1}", request.GetApiCode(), sign)); } try { using (var resp = (HttpWebResponse)webRequest.GetResponse()) { try { Stream respStream = resp.GetResponseStream(); if (respStream == null) { throw new WebException("GetResponseStream returned null"); } var streamReader = new StreamReader(respStream); string respStr = streamReader.ReadToEnd(); //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 响应内容: {1}", request.GetApiCode(), respStr)); } return JsonConvert.DeserializeObject<t>(respStr); } catch (Exception e) { //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 响应错误: {1}", request.GetApiCode(), e.Message)); } throw new ApplicationException(e.Message, e); } } } catch (WebException e) { var errMsg = new StreamReader(e.Response.GetResponseStream()).ReadToEnd(); //记录日志 if (isNeedLogFile) { logFile.Log(string.Format("[{0}] 请求错误: {1}", request.GetApiCode(), errMsg)); } throw new APIServiceException(errMsg); } } private string ComputeHash(string key, string secret, string body) { return Convert.ToBase64String( SHA1.Create().ComputeHash(Encoding.Default.GetBytes(string.Concat(key, secret, body.Trim())))); } }</t></t></t></t></t>
以上就是Api项目端的各个核心环节的详细介绍。
接下来会对调用端即前端进行简单的介绍。Asp.net(三)Web端展示
Das obige ist der detaillierte Inhalt vonAsp.net (2) Geschäftsverarbeitungsschnittstellenprojekt (Web-API). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Die Beziehung zwischen C# und .NET ist untrennbar miteinander verbunden, aber nicht dasselbe. C# ist eine Programmiersprache, während .NET eine Entwicklungsplattform ist. C# wird verwendet, um Code zu schreiben, in .NETs Intermediate Language (IL) zu kompilieren und von der .NET -Laufzeit (CLR) ausgeführt zu werden.

C#.NET ist immer noch wichtig, da es leistungsstarke Tools und Bibliotheken bietet, die mehrere Anwendungsentwicklung unterstützen. 1) C# kombiniert .NET Framework, um die Entwicklung effizient und bequem zu machen. 2) Mechanismus zum Typensicherheit und Müllsammlung von C#erhöht die Vorteile. 3) .NET bietet eine plattformübergreifende laufende Umgebung und eine reichhaltige APIs, wodurch die Flexibilität der Entwicklung verbessert wird.

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C# und .NET passen sich durch kontinuierliche Aktualisierungen und Optimierungen an die Bedürfnisse neuer Technologien an. 1) C# 9.0 und .NET5 Führen Sie den Datensatztyp und die Leistungsoptimierung ein. 2) .NETCORE verbessert die native und containerische Unterstützung von Cloud. 3) ASP.NetCore integriert sich in moderne Webtechnologien. 4) ML.NET unterstützt maschinelles Lernen und künstliche Intelligenz. 5) Asynchrone Programmierung und Best Practices verbessern die Leistung.

C#.NetissoBableFoREenterPrise-Level Applications-WithemicrosoftCosystemDuetoitsStrongtyPing, Richlibrary, Androbustperformance.

Der Programmierungsprozess von C# in .NET enthält die folgenden Schritte: 1) Schreiben von C# Code, 2) Kompilieren in eine mittlere Sprache (IL) und 3), die durch die .NET -Laufzeit (CLR) ausführt. Die Vorteile von C# in .NET sind die moderne Syntax, das leistungsstarke Typsystem und die enge Integration in das .NET -Framework, das für verschiedene Entwicklungsszenarien geeignet ist, von Desktop -Anwendungen bis hin zu Webdiensten.

C# ist eine moderne, objektorientierte Programmiersprache, die von Microsoft und als Teil des .NET-Frameworks entwickelt wurde. 1.C# unterstützt die objektorientierte Programmierung (OOP), einschließlich Einkapselung, Vererbung und Polymorphismus. 2. Asynchrones Programmieren in C# wird über Async implementiert und wartet auf Schlüsselwörter, um die Reaktionsfähigkeit der Anwendungen zu verbessern. 3.. Verwenden Sie LINQ, um Datensammlungen präzise zu verarbeiten. 4. Häufige Fehler umfassen Null-Referenzausnahmen und Indexausnahmen außerhalb des Bereichs. Zu den Debugging -Fähigkeiten gehört die Verwendung eines Debuggers und Ausnahmeberechnung. 5. Leistungsoptimierung umfasst die Verwendung von StringBuilder und das Vermeiden von unnötigem Packung und Unboxing.

Die Teststrategien für C#.NET-Anwendungen umfassen Unit-Tests, Integrationstests und End-to-End-Tests. 1. Unit -Test stellt sicher, dass die Mindesteinheit des Codes unter Verwendung des Frameworks MStest, Nunit oder Xunit unabhängig funktioniert. 2. Integrierte Tests überprüfen die Funktionen mehrerer Einheiten kombinierter, häufig verwendeten simulierten Daten und externen Diensten. 3. End-to-End-Tests simuliert den vollständigen Betriebsprozess des Benutzers, und Selen wird normalerweise für automatisierte Tests verwendet.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

SublimeText3 Linux neue Version
SublimeText3 Linux neueste Version

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

VSCode Windows 64-Bit-Download
Ein kostenloser und leistungsstarker IDE-Editor von Microsoft