Ts'ebeliso e tsoetseng pele ea libaesekele kapa seva ea bareki e ipapisitseng le moralo oa C# .Net

ho kena

E qalile ha mosebetsi-'moho a etsa tlhahiso ea hore ke etse tšebeletso e nyenyane ea websaete. E ne e lokela ho ba ntho e kang tinder, empa bakeng sa hangout ea IT. Ts'ebetso e bonolo haholo, o ingolisa, o tlatsa profil mme o fetela ntlheng ea mantlha, e leng, ho fumana motho ea kenang lipakeng le ho holisa likhokahano tsa hau le ho etsa metsoalle e mecha.

Mona ke tlameha ho nyenyefatsa le ho bua hanyenyane ka 'na, e le hore nakong e tlang ho ka hlaka hore na ke hobane'ng ha ke nkile mehato e joalo ho nts'etsopele.

Hajoale ke na le boemo ba Setsebi sa Teknoloji setsing sa papali ea papali, boiphihlelo ba ka ba lenaneo la C # bo ne bo thehiloe feela ho ngoleng mangolo le lits'ebeletso tsa Unity mme, ho phaella ho sena, ho theha li-plugins bakeng sa mosebetsi oa boemo bo tlase ka lisebelisoa tsa android. Ka ntle ho lefatše lena, ha ke e-s'o ikhethele monyetla o joalo.

Karolo ea 1. Frame Prototyping

Ha ke se ke entse qeto ea hore na tšebeletso ena e tla ba joang, ke ile ka qala ho batla mekhoa ea ho kenya ts'ebetsong. Tsela e bonolo ka ho fetisisa e ka ba ho fumana mofuta o mong oa tharollo e lokiselitsoeng, eo ho eona, joaloka sephooko lefatšeng, u ka hulang mechine ea rona le ho beha ntho eohle bakeng sa khalemelo ea sechaba.
Empa sena ha se thahaselle, ha kea bona phephetso le kutloisiso ho sena, ka hona ke ile ka qala ho ithuta mahlale a webo le mekhoa ea ho sebelisana le bona.

Thuto e qalile ka ho sheba lihlooho le litokomane ho C # .Net. Mona ke ile ka fumana litsela tse sa tšoaneng tsa ho phetha mosebetsi oo. Ho na le mekhoa e mengata ea ho sebelisana le marang-rang, ho tloha ho litharollo tse feletseng tse kang ASP.Net kapa litšebeletso tsa Azure, ho tsamaisana le likamano tsa TcpHttp.

Kaha ke entse boiteko ba pele le ASP, ke ile ka e hlakola hang-hang, ka maikutlo a ka e ne e le qeto e boima haholo bakeng sa tšebeletso ea rona. Re ke ke ra sebelisa leha e le karolo ea boraro ea bokhoni ba sethala sena, kahoo ke ile ka tsoela pele ho batla. Khetho e ile ea hlaha lipakeng tsa TCP le Http client-server. Mona, ho Habré, ke ile ka kopana le sehlooho se buang ka multithreaded server, ha ke se ke bokelletse le ho lekoa, ke ile ka etsa qeto ea ho tsepamisa maikutlo ho sebelisana le li-connections tsa TCP, ka lebaka le itseng ke ne ke nahana hore http e ke ke ea ntumella ho etsa tharollo ea sefapano.

Mofuta oa pele oa seva o ne o kenyelletsa ho sebetsana le likhokahano, ho sebeletsa litaba tsa leqephe la webo tse sa fetoheng, ho kenyelletsa le database ea mosebelisi. 'Me bakeng sa ho qala, ke ile ka etsa qeto ea ho haha ​​​​sesebelisoa sa ho sebetsa le sebaka sa marang-rang, e le hore hamorao nka tlama ts'ebetso ea kopo ho android le ios mona.

Khoutu ke ena
Khoele e kholo e amohelang bareki ka mokhoa o sa feleng:

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);
        }
    }
}

Moreki ka boeena:

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();
}
}
}

Le database ea pele e hahiloeng ho SQL ea lehae:

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}");
}
}
}
}
}

Joalokaha u ka bona, phetolelo ena e fapane hanyenyane le e hlahang sehloohong sena. Ha e le hantle, ke ho kenya feela maqephe a tsoang foldareng ea k'homphieutha le database e kenyelelitsoeng mona (eo, ka tsela, e sa kang ea sebetsa phetolelong ena, ka lebaka la meralo e fosahetseng ea meralo).

Khaolo ea 2

Kamora ho leka seva, ke ile ka fihlela qeto ea hore ena e tla ba tharollo e ntle (spoiler: che), bakeng sa tšebeletso ea rona, kahoo morero o ile oa qala ho fumana logic.
Mohato ka mohato, li-module tse ncha li ile tsa qala ho hlaha 'me ts'ebetso ea seva e ile ea eketseha. Seva e na le sebaka sa tlhahlobo le khokahanyo ea ssl.

Khoutu e nyane e hlalosang mohopolo oa seva le ts'ebetso ea bareki
Mofuta o ntlafalitsoeng oa seva, ho kenyeletsoa le tšebeliso ea setifikeiti.

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();
        }
    }
}

Hape le moreki e mocha ea nang le tumello ka 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);
}

}
}

Empa kaha seva se sebetsa feela ho khokahano ea TCP, hoa hlokahala ho theha module e ka lemohang moelelo oa kopo. Ke ile ka etsa qeto ea hore parser e loketse mona e tla senya kopo ho tsoa ho mofani oa likarolo tse arohaneng tseo nka sebelisanang le tsona e le ho fa mofani likarabo tse hlokahalang.

Mohlalosi

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;
}
}
}

Mohloli oa eona o teng tabeng ea hore ka thuso ea lipolelo tse tloaelehileng ho senya kopo ka likarolo. Re fumana molaetsa o tsoang ho mofani, khetha mohala oa pele, o nang le mokhoa le ho kopa url. Ebe re bala lihlooho, tseo re li khannang ka har'a mofuta oa HeaderName = Content, hape re fumana, haeba ho le joalo, litaba tse tsamaeang le tsona (mohlala, querystring) tseo re li khannang ka mokhoa o tšoanang. Ntle le moo, mohlahlobi o fumana hore na moreki oa hajoale o lumelletsoe mme o boloka data ea hae. Likopo tsohle tse tsoang ho bareki ba lumelletsoeng li na le hash ea tumello, e bolokiloeng ka li-cookies, ka lebaka leo ho ka khonehang ho arola mohopolo o mong oa mosebetsi bakeng sa mefuta e 'meli ea bareki le ho ba fa likarabo tse nepahetseng.

Che, karolo e nyane, e ntle e lokelang ho fetisetsoa mojuleng o arohaneng, e fetolelang likopo tse kang "site.com/@UserName" hore e be maqephe a basebelisi a hlahisoang ka matla. Kamora ho sebetsana le kopo, li-module tse latelang lia sebetsa.

Khaolo ea 3. Ho kenya handlebar, ho tlotsa ketane

Hang ha sebatli se qetile, sebatli se qala ho sebetsa, se fana ka litaelo tse ling ho seva le ho arola taolo ka likarolo tse peli.

motho ea bonolo

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);
            };
        }
    }
}

Ha e le hantle, ho na le cheke e le 'ngoe feela bakeng sa tumello ea mosebedisi, ka mor'a moo ts'ebetso ea kopo e qala.

Balaoli ba bareki
Haeba mosebelisi a sa lumelloa, joale ho eena ts'ebetso e ipapisitse le ponts'o ea li-profiles tsa mosebelisi le fensetere ea ngoliso ea tumello. Khoutu ea mosebelisi ea lumelletsoeng e shebahala ka mokhoa o ts'oanang, ka hona ha ke bone lebaka la ho e qopitsa.

Mosebedisi ya sa dumellwang

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;

}

}

}
}

Ehlile, mosebelisi o tlameha ho fumana litaba tsa maqephe, kahoo bakeng sa likarabo ho na le mojule o latelang, o ikarabellang ho arabela kopo ea lisebelisoa.

MongoliMolaoli

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();
}
}
}

Empa molemong oa ho bonts'a mosebelisi boemo ba hae le liprofinse tsa basebelisi ba bang, ke nkile qeto ea ho sebelisa RazorEngine, kapa karolo ea eona. E boetse e kenyelletsa ho sebetsana le likopo tse mpe le ho fana ka khoutu e nepahetseng ea phoso.

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();
            }
        }
    }
}

'Me ehlile, e le hore netefatso ea basebelisi ba nang le tumello e sebetse, tumello ea hlokahala. Mojule oa tumello o hokahana le database. Lintlha tse fumanoeng ho tsoa liforomong tse sebakeng sa marang-rang li aroloa ho tsoa moelelong, mosebelisi oa bolokoa mme o amohela li-cookies le phihlello ea ts'ebeletso ka ho khutlisa.

Mojule oa tumello

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);
}
}
}
}

Mme ke kamoo database e shebahalang ka teng:

Sebaka sa polokelo ea litaba

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;
}
}
}
}


'Me ntho e' ngoe le e 'ngoe e sebetsa joaloka oache, tumello le mosebetsi oa ho ngolisa, mosebetsi o fokolang oa ho fumana tšebeletso o se o ntse o le teng' me ke nako ea ho ngola kopo le ho tlama ntho eohle ka mesebetsi e ka sehloohong eo ntho e 'ngoe le e' ngoe e etsoang ho eona.

Khaolo ea 4

Ho fokotsa litšenyehelo tsa mosebetsi oa ho ngola likopo tse peli bakeng sa liforomo tse peli, ke ile ka etsa qeto ea ho etsa cross-platform ka Xamarin.Forms. Hape, ka lebaka la hore e ho C #. Ha ke se ke entse tlhahlobo ea tlhahlobo e romellang data feela ho seva, ke ile ka kena motsotsong o le mong o khahlisang. Bakeng sa kopo e tsoang ho sesebelisoa, bakeng sa ho ithabisa, ke ile ka e kenya ts'ebetsong ho HttpClient mme ka e lahlela ho seva HttpRequestMessage e nang le data ho tsoa ho foromo ea tumello ka mokhoa oa json. Ntle le ho lebella ntho leha e le efe ka ho khetheha, ke ile ka bula lenane la seva 'me ka bona kopo e tsoang ho sesebelisoa se nang le boitsebiso bohle moo. Bofokoli bo bobebe, tlhokomeliso ea ntho e 'ngoe le e' ngoe e entsoeng libeke tse 3 tse fetileng tsa mantsiboea a bobebe. Ho hlahloba ho nepahala ha data e rometsoeng, ke ile ka bokella seva sa teko ho HttpListner. Ha ke se ke fumane kopo e latelang e se e ntse e le ho eona, ke ile ka e arola ka mela e 'maloa ea khoutu, ka fumana lintlha tsa KeyValuePair ho tsoa foromong. Tlhaloso ea lipotso e fokotsoe ho mela e 'meli.

Ke ile ka qala ho hlahloba ho ea pele, ha hoa ka ha boleloa pele, empa ho seva se fetileng ke ne ke ntse ke kenya ts'ebetsong moqoqo o hahiloeng holim'a li-websockets. E ne e sebetsa hantle, empa molao-motheo oa ho sebelisana ka Tcp o ne o sithabetsa, ho ne ho tlameha ho hlahisoa ho eketsehileng haholo e le hore ho ka etsoa ka nepo tšebelisano ea basebelisi ba babeli ka ho rengoa ha mangolo. Sena se kenyelletsa ho fetisa kopo ea ho fetola khokahano le ho bokella karabo ho sebelisa protocol ea RFC 6455. Ka hona, ho seva sa teko, ke ile ka etsa qeto ea ho theha khokahano e bonolo ea websocket. Ehlile molemong oa thahasello.

Khokahano ea moqoqo

 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();
                        }
                    }
                }
            }
        }

Mme e ile ya sebetsa. Seva ka boeona e ile ea theha khokahanyo, ea hlahisa senotlolo sa karabo. Ha kea ka ka tlameha ho hlophisa ngoliso ea seva ka thoko ka ssl, ho lekane hore sistimi e se e ntse e e-na le setifikeiti se kentsoeng boema-kepeng bo hlokahalang.

Ka lehlakoreng la lisebelisoa le ka lehlakoreng la sebaka sa marang-rang, bareki ba babeli ba fapanyetsana melaetsa, sena sohle se ile sa kenngoa. Ha ho li-parser tse kholo tse fokotsang seva, ho ne ho sa hlokahale letho la sena. Nako ea ho arabela e fokotsehile ho tloha ho 200ms ho ea ho 40-30ms. Mme ke ile ka fihlela qeto e nepahetseng feela.

Ts'ebeliso e tsoetseng pele ea libaesekele kapa seva ea bareki e ipapisitseng le moralo oa C# .Net

Lahlela ts'ebetsong ea hona joale ea seva ho Tcp 'me u ngole ntho e' ngoe le e 'ngoe tlas'a Http. Hona joale morero o mothating oa ho tsosolosa, empa ho ea ka melao-motheo e fapaneng ka ho feletseng ea ho sebelisana. Ts'ebetso ea lisebelisoa le sebaka sa marang-rang se amahanngoa le ho lokisoa 'me se na le mohopolo o tšoanang, ka phapang feela eo lisebelisoa ha li hloke ho hlahisa maqephe a html.

fihlela qeto e

"Ha u tsebe ford, u se ke ua kenya hlooho ea hau ka metsing" Ke nahana hore, pele ke qala mosebetsi, ke ne ke lokela ho hlalosa ka ho hlaka lipakane le merero, hammoho le ho ithuta ka theknoloji e hlokahalang le mekhoa ea ho kenya ts'ebetsong ho bareki ba fapaneng. Morero o se o le haufi le ho phethoa, empa mohlomong ke tla khutla ho tla bua ka kamoo ke ileng ka senya lintho tse ling hape. Ke ithutile ho hongata nakong ea ts'ebetso ea nts'etsopele, empa ho na le ho hongata ho ithutang nakong e tlang. Haeba u balile ho fihlela mona, kea leboha ha u bala.

Source: www.habr.com