Ilọsiwaju keke ile tabi ohun elo olupin-olupin ti o da lori ilana C # .Net

Ifihan

Gbogbo rẹ bẹrẹ nigbati alabaṣiṣẹpọ kan daba pe Mo ṣẹda iṣẹ wẹẹbu kekere kan. O yẹ ki o jẹ nkan bi Tinder, ṣugbọn fun eniyan IT. Iṣẹ naa rọrun pupọ, o forukọsilẹ, fọwọsi profaili kan ki o tẹsiwaju si aaye akọkọ, eyun wiwa eniyan lati ba sọrọ ati faagun awọn asopọ rẹ ati ṣiṣe awọn ojulumọ tuntun.

Nibi ni mo gbọdọ ṣe kan padasehin ati ki o sọ kekere kan nipa ara mi, ki ni ojo iwaju o yoo jẹ diẹ ko o idi ti mo ti mu iru awọn igbesẹ ti ni idagbasoke.

Ni akoko yii Mo di ipo ti Onimọnran Imọ-ẹrọ ni ile-iṣere ere kan, iriri siseto mi ni C # ti kọ nikan lori kikọ awọn iwe afọwọkọ ati awọn ohun elo fun Isokan ati, ni afikun si eyi, ṣiṣẹda awọn afikun fun iṣẹ ipele kekere pẹlu awọn ẹrọ Android. Emi ko tii ṣe adaṣe ni ikọja aye kekere yii, lẹhinna iru anfani bẹẹ dide.

Apá 1. fireemu prototyping

Lẹhin ti pinnu kini iṣẹ yii yoo dabi, Mo bẹrẹ lati wa awọn aṣayan fun imuse. Ohun ti o rọrun julọ yoo jẹ lati wa iru ojutu ti a ti ṣetan, lori eyiti, bi owiwi kan lori agbaiye, awọn ẹrọ ẹrọ wa le fa ati pe gbogbo nkan le farahan si ibawi ti gbogbo eniyan.
Ṣugbọn eyi kii ṣe iyanilenu, Emi ko rii eyikeyi ipenija tabi ori ninu rẹ, ati nitorinaa Mo bẹrẹ ikẹkọ awọn imọ-ẹrọ wẹẹbu ati awọn ọna ti ibaraenisọrọ pẹlu wọn.

Mo bẹrẹ ikẹkọ nipa wiwo awọn nkan ati awọn iwe lori C # .Net. Nibi ti mo ti ri orisirisi ona lati pari awọn iṣẹ-ṣiṣe. Awọn ọna ṣiṣe pupọ lo wa fun ibaraenisepo pẹlu nẹtiwọọki, lati awọn ojutu ti o ni kikun bi ASP.Net tabi awọn iṣẹ Azure, lati taara ibaraenisepo pẹlu awọn asopọ TcpHttp.

Lẹhin igbiyanju mi ​​akọkọ pẹlu ASP, Mo kọ ọ silẹ lẹsẹkẹsẹ; ni ero mi, eyi nira pupọ ju ipinnu iṣẹ-isin wa. A kii yoo lo paapaa idamẹta ti awọn agbara Syeed yii, nitorinaa Mo tẹsiwaju wiwa mi. Yiyan wa laarin TCP ati olupin-olupin Http. Níbí, ní Habré, mo rí àpilẹ̀kọ kan nípa rẹ̀ multithreaded olupin, Ni gbigba ati idanwo rẹ, Mo pinnu lati ni idojukọ pataki lori ibaraenisepo pẹlu awọn asopọ TCP, fun idi kan Mo ro pe http kii yoo gba mi laaye lati ṣẹda ojutu agbelebu.

Ẹ̀yà àkọ́kọ́ ti olupin náà pẹ̀lú ìṣàkóso ìsopọ̀ pẹ̀lú, ṣiṣẹ́ àkóónú ojú-ewé wẹ́ẹ̀bù aimi, tí ó sì ní ibùdó dátà oníṣe kan. Ati lati bẹrẹ pẹlu, Mo pinnu lati kọ iṣẹ ṣiṣe fun ṣiṣẹ pẹlu aaye naa, nitorinaa MO le ṣafikun sisẹ ohun elo naa nigbamii lori Android ati iOS.

Eyi ni diẹ ninu koodu
Okun akọkọ gbigba awọn alabara ni lupu ailopin:

using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ClearServer
{

    class Server
    {
        TcpListener Listener;
        public Server(int Port)
        {
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start();

            while (true)
            {
                TcpClient Client = Listener.AcceptTcpClient();
                Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                Thread.Start(Client);
            }
        }

        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }

        ~Server()
        {
            if (Listener != null)
            {
                Listener.Stop();
            }
        }

        static void Main(string[] args)
        {
            DatabaseWorker sqlBase = DatabaseWorker.GetInstance;

            new Server(80);
        }
    }
}

Olutọju alabara funrararẹ:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ClearServer
{
    class Client
    {


        public Client(TcpClient Client)
        {

            string Message = "";
            byte[] Buffer = new byte[1024];
            int Count;
            while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
            {
                Message += Encoding.UTF8.GetString(Buffer, 0, Count);

                if (Message.IndexOf("rnrn") >= 0 || Message.Length > 4096)
                {
                    Console.WriteLine(Message);
                    break;
                }
            }

            Match ReqMatch = Regex.Match(Message, @"^w+s+([^s?]+)[^s]*s+HTTP/.*|");
            if (ReqMatch == Match.Empty)
            {
                ErrorWorker.SendError(Client, 400);
                return;
            }
            string RequestUri = ReqMatch.Groups[1].Value;
            RequestUri = Uri.UnescapeDataString(RequestUri);
            if (RequestUri.IndexOf("..") >= 0)
            {
                ErrorWorker.SendError(Client, 400);
                return;
            }
            if (RequestUri.EndsWith("/"))
            {
                RequestUri += "index.html";
            }

            string FilePath =

quot;D:/Web/TestSite{RequestUri}";

if (!File.Exists(FilePath))
{
ErrorWorker.SendError(Client, 404);
return;
}

string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.'));

string ContentType = "";

switch (Extension)
{
case ".htm":
case ".html":
ContentType = "text/html";
break;
case ".css":
ContentType = "text/css";
break;
case ".js":
ContentType = "text/javascript";
break;
case ".jpg":
ContentType = "image/jpeg";
break;
case ".jpeg":
case ".png":
case ".gif":
ContentType =


quot;image/{Extension.Substring(1)}";
break;
default:
if (Extension.Length > 1)
{
ContentType =


quot;application/{Extension.Substring(1)}";
}
else
{
ContentType = "application/unknown";
}
break;
}

FileStream FS;
try
{
FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (Exception)
{
ErrorWorker.SendError(Client, 500);
return;
}

string Headers =


quot;HTTP/1.1 200 OKnContent-Type: {ContentType}nContent-Length: {FS.Length}nn";
byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);

while (FS.Position < FS.Length)
{
Count = FS.Read(Buffer, 0, Buffer.Length);
Client.GetStream().Write(Buffer, 0, Count);
}

FS.Close();
Client.Close();
}
}
}

Ati ipilẹ data akọkọ ti a ṣe lori SQL agbegbe:

using System;
using System.Data.Linq;
namespace ClearServer
{
    class DatabaseWorker
    {

        private static DatabaseWorker instance;

        public static DatabaseWorker GetInstance
        {
            get
            {
                if (instance == null)
                    instance = new DatabaseWorker();
                return instance;
            }
        }


        private DatabaseWorker()
        {
            string connectionStr = databasePath;
            using (DataContext db = new DataContext(connectionStr))
            {
                Table<User> users = db.GetTable<User>();
                foreach (var item in users)
                {
                    Console.WriteLine(

quot;{item.login} {item.password}");
}
}
}
}
}

Bi o ti le rii, ẹya yii yatọ diẹ si ọkan ninu nkan naa. Ni otitọ, nibi a kan ṣafikun ikojọpọ awọn oju-iwe lati folda kan lori kọnputa ati data data (eyiti, nipasẹ ọna, ko ṣiṣẹ ni ẹya yii nitori faaji asopọ ti ko tọ).

Chapter 2. Screwing awọn kẹkẹ

Lẹhin idanwo olupin naa, Mo wa si ipari pe eyi yoo jẹ ojutu ti o dara julọ (apanirun: rara), fun iṣẹ wa, nitorina iṣẹ naa bẹrẹ si ni imọran.
Igbesẹ nipasẹ igbese, awọn modulu titun bẹrẹ si han ati iṣẹ-ṣiṣe olupin ti fẹ sii. Olupin naa ti ni aaye idanwo kan ati fifi ẹnọ kọ nkan asopọ SSL.

Koodu diẹ diẹ sii ti n ṣapejuwe ọgbọn ti olupin ati sisẹ alabara
Ẹya imudojuiwọn ti olupin ti o pẹlu lilo ijẹrisi kan.

using System;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Security;
using System.Security.Cryptography.X509Certificates;
using System.Security.Permissions;
using System.Security.Policy;
using System.Threading;


namespace ClearServer
{

    sealed class Server
    {
        readonly bool ServerRunning = true;
        readonly TcpListener sslListner;
        public static X509Certificate serverCertificate = null;
        Server()
        {
            serverCertificate = X509Certificate.CreateFromSignedFile(@"C:sslitinder.online.crt");
            sslListner = new TcpListener(IPAddress.Any, 443);
            sslListner.Start();
            Console.WriteLine("Starting server.." + serverCertificate.Subject + "n" + Assembly.GetExecutingAssembly().Location);
            while (ServerRunning)
            {
                TcpClient SslClient = sslListner.AcceptTcpClient();
                Thread SslThread = new Thread(new ParameterizedThreadStart(ClientThread));
                SslThread.Start(SslClient);
            }
            
        }
        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }

        ~Server()
        {
            if (sslListner != null)
            {
                sslListner.Stop();
            }
        }

        public static void Main(string[] args)
        {
            if (AppDomain.CurrentDomain.IsDefaultAppDomain())
            {
                Console.WriteLine("Switching another domain");
                new AppDomainSetup
                {
                    ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
                };
                var current = AppDomain.CurrentDomain;
                var strongNames = new StrongName[0];
                var domain = AppDomain.CreateDomain(
                    "ClearServer", null,
                    current.SetupInformation, new PermissionSet(PermissionState.Unrestricted),
                    strongNames);
                domain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location);
            }
            new Server();
        }
    }
}

Ati tun oluṣakoso alabara tuntun pẹlu aṣẹ SSL:

using ClearServer.Core.Requester;
using System;
using System.Net.Security;
using System.Net.Sockets;

namespace ClearServer
{
    public class Client
    {
        public Client(TcpClient Client)
        {
            SslStream SSlClientStream = new SslStream(Client.GetStream(), false);
            try
            {
                SSlClientStream.AuthenticateAsServer(Server.serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: true);
            }
            catch (Exception e)
            {
                Console.WriteLine(
                    "---------------------------------------------------------------------n" +


quot;|{DateTime.Now:g}n|------------n|{Client.Client.RemoteEndPoint}n|------------n|Exception: {e.Message}n|------------n|Authentication failed - closing the connection.n" +
"---------------------------------------------------------------------n");
SSlClientStream.Close();
Client.Close();
}
new RequestContext(SSlClientStream, Client);
}

}
}

Ṣugbọn niwọn igba ti olupin naa n ṣiṣẹ ni iyasọtọ lori asopọ TCP, o jẹ dandan lati ṣẹda module kan ti o le ṣe idanimọ agbegbe ti ibeere naa. Mo pinnu pe parser yoo dara nibi ti yoo fọ ibeere lati ọdọ alabara si awọn apakan lọtọ pẹlu eyiti MO le ṣe ajọṣepọ lati fun alabara ni awọn idahun to wulo.

Parser

using ClearServer.Core.UserController;
using ReServer.Core.Classes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ClearServer.Core.Requester
{
    public class RequestContext
    {
        public string Message = "";
        private readonly byte[] buffer = new byte[1024];
        public string RequestMethod;
        public string RequestUrl;
        public User RequestProfile;
        public User CurrentUser = null;
        public List<RequestValues> HeadersValues;
        public List<RequestValues> FormValues;
        private TcpClient TcpClient;

        private event Action<SslStream, RequestContext> OnRead = RequestHandler.OnHandle;

        DatabaseWorker databaseWorker = new DatabaseWorker();

        public RequestContext(SslStream ClientStream, TcpClient Client)
        {

            this.TcpClient = Client;
            try
            {
                ClientStream.BeginRead(buffer, 0, buffer.Length, ClientRead, ClientStream);
            }
            catch { return; }
        }
        private void ClientRead(IAsyncResult ar)
        {
            SslStream ClientStream = (SslStream)ar.AsyncState;

            if (ar.IsCompleted)
            {
                Message = Encoding.UTF8.GetString(buffer);
                Message = Uri.UnescapeDataString(Message);
                Console.WriteLine(

quot;n{DateTime.Now:g} Client IP:{TcpClient.Client.RemoteEndPoint}n{Message}");
RequestParse();
HeadersValues = HeaderValues();
FormValues = ContentValues();
UserParse();
ProfileParse();
OnRead?.Invoke(ClientStream, this);
}
}

private void RequestParse()
{
Match methodParse = Regex.Match(Message, @"(^w+)s+([^s?]+)[^s]*s+HTTP/.*|");
RequestMethod = methodParse.Groups[1].Value.Trim();
RequestUrl = methodParse.Groups[2].Value.Trim();
}
private void UserParse()
{
string cookie;
try
{
if (HeadersValues.Any(x => x.Name.Contains("Cookie")))
{
cookie = HeadersValues.FirstOrDefault(x => x.Name.Contains("Cookie")).Value;
try
{
CurrentUser = databaseWorker.CookieValidate(cookie);
}
catch { }
}
}
catch { }

}
private List<RequestValues> HeaderValues()
{
var values = new List<RequestValues>();
var parse = Regex.Matches(Message, @"(.*?): (.*?)n");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim()
});
}
return values;
}

private void ProfileParse()
{
if (RequestUrl.Contains("@"))
{
RequestProfile = databaseWorker.FindUser(RequestUrl.Substring(2));
RequestUrl = "/profile";
}
}
private List<RequestValues> ContentValues()
{
var values = new List<RequestValues>();
var output = Message.Trim('n').Split().Last();
var parse = Regex.Matches(output, @"([^&].*?)=([^&]*b)");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim().Replace('+', ' ')
});
}
return values;
}
}
}

Kokoro rẹ ni lati fọ ibeere naa si awọn apakan nipa lilo awọn ikosile deede. A gba ifiranṣẹ lati ọdọ alabara, yan laini akọkọ, eyiti o ni ọna ati url beere. Lẹhinna a ka awọn akọle, eyiti a fi sinu akojọpọ fọọmu HeaderName=Akoonu, ati pe a tun rii, ti o ba wa, akoonu ti o tẹle (fun apẹẹrẹ, okun ibeere) eyiti a tun fi sinu akopọ ti o jọra. Ni afikun, olutọpa naa rii boya alabara lọwọlọwọ ni aṣẹ ati tọju data rẹ. Gbogbo awọn ibeere lati ọdọ awọn alabara ti a fun ni aṣẹ ni hash iwe-aṣẹ kan, eyiti o fipamọ sinu awọn kuki, o ṣeun si eyi o ṣee ṣe lati yapa awọn ọgbọn iṣẹ ṣiṣe siwaju fun awọn iru awọn alabara meji ki o fun wọn ni awọn idahun to pe.

O dara, ẹya kekere kan, ti o wuyi ti yoo tọsi fifi sinu module lọtọ, iyipada ti awọn ibeere bii “site.com/@UserName” sinu awọn oju-iwe olumulo ti ipilẹṣẹ agbara. Lẹhin ṣiṣe ibeere naa, awọn modulu atẹle wa sinu ere.

Chapter 3. Fifi awọn idari oko kẹkẹ, lubrication ti awọn pq

Ni kete ti parser ti pari iṣẹ rẹ, oluṣakoso naa wa sinu ere, fifun awọn ilana siwaju si olupin ati pinpin iṣakoso si awọn ẹya meji.

Olutọju rọrun

using ClearServer.Core.UserController;
using System.Net.Security;
namespace ClearServer.Core.Requester
{
    public class RequestHandler
    {
        public static void OnHandle(SslStream ClientStream, RequestContext context)
        {

            if (context.CurrentUser != null)
            {
                new AuthUserController(ClientStream, context);
            }
            else 
            {
                new NonAuthUserController(ClientStream, context);
            };
        }
    }
}

Ni otitọ, ayẹwo kan nikan ni o wa fun aṣẹ olumulo, lẹhin eyi ilana ti ibeere naa bẹrẹ.

Awọn oludari onibara
Ti olumulo ko ba fun ni aṣẹ, lẹhinna iṣẹ ṣiṣe fun u da lori ifihan awọn profaili olumulo ati window iforukọsilẹ aṣẹ. Awọn koodu fun ohun aṣẹ olumulo wulẹ nipa kanna, ki Emi ko ri idi lati pidánpidán.

olumulo laigba aṣẹ

using ClearServer.Core.Requester;
using System.IO;
using System.Net.Security;

namespace ClearServer.Core.UserController
{
    internal class NonAuthUserController
    {
        private readonly SslStream ClientStream;
        private readonly RequestContext Context;
        private readonly WriteController WriteController;
        private readonly AuthorizationController AuthorizationController;

        private readonly string ViewPath = "C:/Users/drdre/source/repos/ClearServer/View";

        public NonAuthUserController(SslStream clientStream, RequestContext context)
        {
            this.ClientStream = clientStream;
            this.Context = context;
            this.WriteController = new WriteController(clientStream);
            this.AuthorizationController = new AuthorizationController(clientStream, context);
            ResourceLoad();
        }

        void ResourceLoad()
        {
            string[] blockextension = new string[] {"cshtml", "html", "htm"};
            bool block = false;
            foreach (var item in blockextension)
            {
                if (Context.RequestUrl.Contains(item))
                {
                    block = true;
                    break;
                }
            }
            string FilePath = "";
            string Header = "";
            var RazorController = new RazorController(Context, ClientStream);
            
            switch (Context.RequestMethod)
            {
                case "GET":
                    switch (Context.RequestUrl)
                    {
                        case "/":
                            FilePath = ViewPath + "/loginForm.html";
                            Header =

quot;HTTP/1.1 200 OKnContent-Type: text/html";
WriteController.DefaultWriter(Header, FilePath);
break;
case "/profile":
RazorController.ProfileLoader(ViewPath);
break;
default:
//в данном блоке кода происходит отсечение запросов к серверу по прямому адресу страницы вида site.com/page.html
if (!File.Exists(ViewPath + Context.RequestUrl) | block)
{
RazorController.ErrorLoader(404);

}
else if (Path.HasExtension(Context.RequestUrl) && File.Exists(ViewPath + Context.RequestUrl))
{
Header = WriteController.ContentType(Context.RequestUrl);
FilePath = ViewPath + Context.RequestUrl;
WriteController.DefaultWriter(Header, FilePath);
}
break;
}
break;

case "POST":
AuthorizationController.MethodRecognizer();
break;

}

}

}
}

Ati pe dajudaju, olumulo gbọdọ gba diẹ ninu iru akoonu oju-iwe, nitorinaa fun awọn idahun o wa module atẹle, eyiti o jẹ iduro fun idahun si awọn ibeere orisun.

Alakoso Alakoso

using System;
using System.IO;
using System.Net.Security;
using System.Text;

namespace ClearServer.Core.UserController
{
    public class WriteController
    {
        SslStream ClientStream;
        public WriteController(SslStream ClientStream)
        {
            this.ClientStream = ClientStream;
        }

        public void DefaultWriter(string Header, string FilePath)
        {
            FileStream fileStream;
            try
            {
                fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                Header =

quot;{Header}nContent-Length: {fileStream.Length}nn";
ClientStream.Write(Encoding.UTF8.GetBytes(Header));
byte[] response = new byte[fileStream.Length];
fileStream.BeginRead(response, 0, response.Length, OnFileRead, response);
}
catch { }
}

public string ContentType(string Uri)
{
string extension = Path.GetExtension(Uri);
string Header = "HTTP/1.1 200 OKnContent-Type:";
switch (extension)
{
case ".html":
case ".htm":
return


quot;{Header} text/html";
case ".css":
return


quot;{Header} text/css";
case ".js":
return


quot;{Header} text/javascript";
case ".jpg":
case ".jpeg":
case ".png":
case ".gif":
return


quot;{Header} image/{extension}";
default:
if (extension.Length > 1)
{
return


quot;{Header} application/" + extension.Substring(1);
}
else
{
return


quot;{Header} application/unknown";
}
}
}

public void OnFileRead(IAsyncResult ar)
{
if (ar.IsCompleted)
{
var file = (byte[])ar.AsyncState;
ClientStream.BeginWrite(file, 0, file.Length, OnClientSend, null);
}
}

public void OnClientSend(IAsyncResult ar)
{
if (ar.IsCompleted)
{
ClientStream.Close();
}
}
}

Ṣugbọn lati le fi olumulo han profaili rẹ ati awọn profaili ti awọn olumulo miiran, Mo pinnu lati lo RazorEngine, tabi dipo apakan rẹ. O tun pẹlu sisẹ awọn ibeere aitọ ati fifun koodu aṣiṣe ti o yẹ.

RazorController

using ClearServer.Core.Requester;
using RazorEngine;
using RazorEngine.Templating;
using System;
using System.IO;
using System.Net;
using System.Net.Security;

namespace ClearServer.Core.UserController
{
    internal class RazorController
    {
        private RequestContext Context;
        private SslStream ClientStream;
        dynamic PageContent;


        public RazorController(RequestContext context, SslStream clientStream)
        {
            this.Context = context;
            this.ClientStream = clientStream;

        }

        public void ProfileLoader(string ViewPath)
        {
            string Filepath = ViewPath + "/profile.cshtml";
            if (Context.RequestProfile != null)
            {
                if (Context.CurrentUser != null && Context.RequestProfile.login == Context.CurrentUser.login)
                {
                    try
                    {
                        PageContent = new { isAuth = true, Name = Context.CurrentUser.name, Login = Context.CurrentUser.login, Skills = Context.CurrentUser.skills };
                        ClientSend(Filepath, Context.CurrentUser.login);
                    }
                    catch (Exception e) { Console.WriteLine(e); }

                }
                else
                {
                    try
                    {
                        PageContent = new { isAuth = false, Name = Context.RequestProfile.name, Login = Context.RequestProfile.login, Skills = Context.RequestProfile.skills };
                        ClientSend(Filepath, "PublicProfile:"+ Context.RequestProfile.login);
                    }
                    catch (Exception e) { Console.WriteLine(e); }
                }
            }
            else
            {
                ErrorLoader(404);
            }


        }

        public void ErrorLoader(int Code)
        {
            try
            {
                PageContent = new { ErrorCode = Code, Message = ((HttpStatusCode)Code).ToString() };
                string ErrorPage = "C:/Users/drdre/source/repos/ClearServer/View/Errors/ErrorPage.cshtml";
                ClientSend(ErrorPage, Code.ToString());
            }
            catch { }

        }

        private void ClientSend(string FilePath, string Key)
        {
            var template = File.ReadAllText(FilePath);
            var result = Engine.Razor.RunCompile(template, Key, null, (object)PageContent);
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result);
            ClientStream.BeginWrite(buffer, 0, buffer.Length, OnClientSend, ClientStream);
        }

        private void OnClientSend(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                ClientStream.Close();
            }
        }
    }
}

Ati pe dajudaju, ni ibere fun ijẹrisi ti awọn olumulo ti a fun ni aṣẹ lati ṣiṣẹ, a nilo aṣẹ. Aṣẹ module interacts pẹlu awọn database. Awọn data ti o gba lati awọn fọọmu lori aaye naa ni a yapa lati inu ọrọ-ọrọ, olumulo ti wa ni fipamọ ati ni ipadabọ gba awọn kuki ati iraye si iṣẹ naa.

module ašẹ

using ClearServer.Core.Cookies;
using ClearServer.Core.Requester;
using ClearServer.Core.Security;
using System;
using System.Linq;
using System.Net.Security;
using System.Text;

namespace ClearServer.Core.UserController
{
    internal class AuthorizationController
    {
        private SslStream ClientStream;
        private RequestContext Context;
        private UserCookies cookies;
        private WriteController WriteController;
        DatabaseWorker DatabaseWorker;
        RazorController RazorController;
        PasswordHasher PasswordHasher;
        public AuthorizationController(SslStream clientStream, RequestContext context)
        {
            ClientStream = clientStream;
            Context = context;
            DatabaseWorker = new DatabaseWorker();
            WriteController = new WriteController(ClientStream);
            RazorController = new RazorController(context, clientStream);
            PasswordHasher = new PasswordHasher();
        }

        internal void MethodRecognizer()
        {
            if (Context.FormValues.Count == 2 && Context.FormValues.Any(x => x.Name == "password")) Authorize();
            else if (Context.FormValues.Count == 3 && Context.FormValues.Any(x => x.Name == "regPass")) Registration();
            else
            {
                RazorController.ErrorLoader(401);
            }
        }

        private void Authorize()
        {
            var values = Context.FormValues;
            var user = new User()
            {
                login = values[0].Value,
                password = PasswordHasher.PasswordHash(values[1].Value)
            };
            user = DatabaseWorker.UserAuth(user);
            if (user != null)
            {
                cookies = new UserCookies(user.login, user.password);
                user.cookie = cookies.AuthCookie;
                DatabaseWorker.UserUpdate(user);
                var response = Encoding.UTF8.GetBytes(

quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {cookies.AuthCookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);

}
else
{
RazorController.ErrorLoader(401);

}
}

private void Registration()
{
var values = Context.FormValues;
var user = new User()
{
name = values[0].Value,
login = values[1].Value,
password = PasswordHasher.PasswordHash(values[2].Value),
};
cookies = new UserCookies(user.login, user.password);
user.cookie = cookies.AuthCookie;
if (DatabaseWorker.LoginValidate(user.login))
{
Console.WriteLine("User ready");
Console.WriteLine(


quot;{user.password} {user.password.Trim().Length}");
DatabaseWorker.UserRegister(user);
var response = Encoding.UTF8.GetBytes(


quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {user.cookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);
}
else
{
RazorController.ErrorLoader(401);
}
}
}
}

Ati pe eyi ni ohun ti sisẹ data data dabi:

Aaye data

using ClearServer.Core.UserController;
using System;
using System.Data.Linq;
using System.Linq;

namespace ClearServer
{
    class DatabaseWorker
    {

        private readonly Table<User> users = null;
        private readonly DataContext DataBase = null;
        private const string connectionStr = @"путькбазе";

        public DatabaseWorker()
        {
            DataBase = new DataContext(connectionStr);
            users = DataBase.GetTable<User>();
        }

        public User UserAuth(User User)
        {
            try
            {
                var user = users.SingleOrDefault(t => t.login.ToLower() == User.login.ToLower() && t.password == User.password);
                if (user != null)
                    return user;
                else
                    return null;
            }
            catch (Exception)
            {
                return null;
            }

        }

        public void UserRegister(User user)
        {
            try
            {
                users.InsertOnSubmit(user);
                DataBase.SubmitChanges();
                Console.WriteLine(

quot;User{user.name} with id {user.uid} added");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}

}

public bool LoginValidate(string login)
{
if (users.Any(x => x.login.ToLower() == login.ToLower()))
{
Console.WriteLine("Login already exists");
return false;
}
return true;
}
public void UserUpdate(User user)
{
var UserToUpdate = users.FirstOrDefault(x => x.uid == user.uid);
UserToUpdate = user;
DataBase.SubmitChanges();
Console.WriteLine(


quot;User {UserToUpdate.name} with id {UserToUpdate.uid} updated");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
public User CookieValidate(string CookieInput)
{
User user = null;
try
{
user = users.SingleOrDefault(x => x.cookie == CookieInput);
}
catch
{
return null;
}
if (user != null) return user;
else return null;
}
public User FindUser(string login)
{
User user = null;
try
{
user = users.Single(x => x.login.ToLower() == login.ToLower());
if (user != null)
{
return user;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
}
}


Ati pe ohun gbogbo n ṣiṣẹ bi clockwork, aṣẹ ati iṣẹ iforukọsilẹ, iṣẹ ṣiṣe ti o kere julọ fun iraye si iṣẹ naa ti wa tẹlẹ ati pe akoko ti de lati kọ ohun elo kan ati di gbogbo nkan papọ pẹlu awọn iṣẹ akọkọ fun eyiti ohun gbogbo n ṣe.

Chapter 4. Jiju kuro ni keke

Lati dinku awọn idiyele iṣẹ ti kikọ awọn ohun elo meji fun awọn iru ẹrọ meji, Mo pinnu lati ṣe agbekọja lori Xamarin.Forms. Lẹẹkansi, o ṣeun si otitọ pe o wa ni C #. Lehin ti ṣe ohun elo idanwo kan ti o fi data ranṣẹ si olupin naa, Mo wa aaye ti o nifẹ si. Fun ibeere lati ẹrọ kan, fun igbadun, Mo ṣe imuse lori HttpClient ati firanṣẹ si olupin HttpRequestMessage, eyiti o ni data ninu fọọmu aṣẹ ni ọna kika json. Laisi ni ireti ohunkohun, Mo ṣii akọọlẹ olupin ati rii ibeere kan nibẹ lati ẹrọ pẹlu gbogbo data naa. Omugo diẹ, imọ ti ohun gbogbo ti a ti ṣe ni ọsẹ mẹta sẹhin ni irọlẹ alẹ. Lati ṣayẹwo deede ti data ti a firanṣẹ, Mo kojọpọ olupin idanwo kan lori HttpListner. Lehin ti o ti gba ibeere miiran tẹlẹ lori rẹ, Mo mu u yato si ni tọkọtaya awọn laini koodu ati gba KeyValuePair ti data lati fọọmu naa. Ṣiṣayẹwo ibeere naa ti dinku si laini meji.

Mo bẹrẹ idanwo siwaju, ko mẹnuba tẹlẹ, ṣugbọn lori olupin iṣaaju Mo tun ṣe imuse iwiregbe ti a ṣe lori awọn oju opo wẹẹbu. O ṣiṣẹ daradara daradara, ṣugbọn ilana pupọ ti ibaraenisepo nipasẹ Tcp jẹ irẹwẹsi; iṣẹ ti ko wulo pupọ ni lati ṣee ṣe lati le kọkọ ni ibamu pẹlu ibaraenisepo ti awọn olumulo meji pẹlu iwe iforukọsilẹ. Eyi pẹlu sisọtọ ibeere kan lati yipada asopọ ati gbigba esi nipa lilo ilana RFC 6455. Nitorinaa, ninu olupin idanwo, Mo pinnu lati ṣẹda asopọ websocket kan ti o rọrun. Igbadun nikan ni.

Sopọ si iwiregbe

 private static async void HandleWebsocket(HttpListenerContext context)
        {
            var socketContext = await context.AcceptWebSocketAsync(null);
            var socket = socketContext.WebSocket;
            Locker.EnterWriteLock();
            try
            {
                Clients.Add(socket);
            }
            finally
            {
                Locker.ExitWriteLock();
            }

            while (true)
            {
                var buffer = new ArraySegment<byte>(new byte[1024]);
                var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
                var str = Encoding.Default.GetString(buffer);
                Console.WriteLine(str);

                for (int i = 0; i < Clients.Count; i++)
                {
                    WebSocket client = Clients[i];

                    try
                    {
                        if (client.State == WebSocketState.Open)
                        {
                            
                            await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                    catch (ObjectDisposedException)
                    {
                        Locker.EnterWriteLock();
                        try
                        {
                            Clients.Remove(client);
                            i--;
                        }
                        finally
                        {
                            Locker.ExitWriteLock();
                        }
                    }
                }
            }
        }

Ati pe o ṣiṣẹ. Olupin funrararẹ tunto asopọ ati ipilẹṣẹ bọtini esi. Emi ko paapaa ni lati tunto iforukọsilẹ olupin lọtọ nipasẹ SSL; o to pe eto naa ti ti fi iwe-ẹri tẹlẹ sori ibudo ti o nilo.

Ni ẹgbẹ ẹrọ ati ni ẹgbẹ aaye, awọn alabara meji paarọ awọn ifiranṣẹ, gbogbo eyi ni a wọle. Ko si awọn parsers nla ti o fa fifalẹ olupin naa, ko si eyi ti a beere. Akoko idahun ti dinku lati 200ms si 40-30ms. Ati pe Mo wa si ipinnu ọtun nikan.

Ilọsiwaju keke ile tabi ohun elo olupin-olupin ti o da lori ilana C # .Net

Jabọ imuse olupin lọwọlọwọ lori Tcp ki o tun kọ ohun gbogbo labẹ Http. Bayi ise agbese na wa ni ipele atunṣe, ṣugbọn gẹgẹbi awọn ilana ti o yatọ patapata ti ibaraenisepo. Awọn iṣẹ ti awọn ẹrọ ati awọn ojula ti wa ni šišẹpọ ati yokokoro ati ki o ni kan to wopo Erongba, pẹlu awọn nikan ni iyato ni wipe nibẹ ni ko si ye lati se ina HTML ojúewé fun awọn ẹrọ.

ipari

"Ti o ko ba mọ ford, maṣe lọ sinu omi" Mo ro pe ṣaaju ki o to bẹrẹ iṣẹ, Mo yẹ ki o ni awọn ibi-afẹde ati awọn ibi-afẹde ti o ni alaye diẹ sii, bi daradara bi iwadi ti awọn imọ-ẹrọ pataki ati awọn ọna fun imuse wọn lori ọpọlọpọ awọn alabara. Ise agbese na ti sunmọ ipari tẹlẹ, ṣugbọn boya Emi yoo pada wa lati sọrọ nipa bawo ni MO ṣe fipamọ awọn nkan kan lẹẹkansi. Mo kọ ẹkọ pupọ lakoko ilana idagbasoke, ṣugbọn paapaa diẹ sii lati kọ ẹkọ ni ọjọ iwaju. Ti o ba ti ka eyi jina, o ṣeun fun ṣiṣe bẹ.

orisun: www.habr.com