Ịnya igwe dị elu ma ọ bụ ngwa nkesa ahịa dabere na C # .Net framework

entry

Ọ malitere mgbe otu onye ọrụ ibe m tụrụ aro ka m mee obere ọrụ weebụ. O kwesiri ka ọ bụrụ ihe dị ka tinder, mana maka nnọkọ IT. Ọrụ a dị nnọọ mfe, ị deba aha, dejupụta profaịlụ ma gaa n'ihu na isi ihe, ya bụ, ịchọta onye na-emekọrịta ihe na ịgbasa njikọ gị na ime ndị enyi ọhụrụ.

N'ebe a, m ga-atụgharị ma kwuo ntakịrị banyere onwe m, nke mere na n'ọdịnihu ọ ga-edo anya ihe mere m ji mee ihe ndị dị otú ahụ na mmepe.

N'oge a, m na-ejide ọnọdụ nke Technical Artist na ụlọ ọrụ egwuregwu, ahụmịhe mmemme C # m dabere na ederede ederede na akụrụngwa maka ịdị n'otu na, na mgbakwunye na nke a, ịmepụta plugins maka ọrụ dị ala na ngwaọrụ gam akporo. N'èzí ụwa a, ahọrọbeghị m ma tụgharịa ụdị ohere ahụ.

Akụkụ 1. Frame Prototyping

N'ịbụ onye kpebiri ihe ọrụ a ga-adị ka, amalitere m ịchọ nhọrọ maka mmejuputa. Ụzọ kachasị mfe ga-abụ ịchọta ụdị ngwọta dị njikere, nke, dị ka ikwiikwii na ụwa, ị nwere ike ịdọrọ ígwè ọrụ anyị ma wepụta ihe niile maka ịkatọ ọha na eze.
Ma nke a abụghị ihe na-adọrọ mmasị, ahụghị m ihe ịma aka na uche na nke a, ya mere amalitere m ịmụ teknụzụ weebụ na ụzọ nke iso ha na-emekọrịta ihe.

Ọmụmụ ihe malitere site na ilele akụkọ na akwụkwọ na C # .Net. N'ebe a, ahụrụ m ụzọ dị iche iche iji rụzuo ọrụ ahụ. Enwere ọtụtụ usoro maka ịmekọrịta na netwọkụ, site na ngwọta zuru oke dị ka ASP.Net ma ọ bụ ọrụ Azure, iji duzie mmekọrịta na njikọ TcpHttp.

Ebe m mere mgbalị mbụ na ASP, m kagbuo ya ozugbo, n'echiche m, mkpebi siri ike maka ọrụ anyị. Anyị agaghị eji ọbụna otu ụzọ n'ụzọ atọ nke ike nke ikpo okwu a, n'ihi ya, m nọgidere na-achọ. Nhọrọ ahụ bilitere n'etiti TCP na Http nkesa ahịa. N'ebe a, na Habré, ahụrụ m otu akụkọ gbasara ya multithreaded nkesa, N'ịbụ onye anakọtara ma nwalee nke, ekpebiri m ilekwasị anya na ịmekọrịta na njikọ TCP, n'ihi ihe ụfọdụ echere m na http agaghị ekwe ka m mepụta ngwọta cross-platform.

Ụdị nke mbụ nke sava ahụ gụnyere njikwa njikọ, na-ebuli ọdịnaya ibe weebụ static, yana gụnyere nchekwa data onye ọrụ. Na maka mmalite, ekpebiri m ịrụ ọrụ maka ịrụ ọrụ na saịtị ahụ, ka m wee nwee ike kee nhazi ngwa na android na iOS ebe a.

Nke a bụ koodu ụfọdụ
Isi eri na-anabata ndị ahịa na akaghị ngwụcha:

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

Onye njikwa onwe ya:

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

Na nchekwa data mbụ e wuru na SQL mpaghara:

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

Dị ka ị pụrụ ịhụ, nsụgharị a dị iche na nke dị n'isiokwu ahụ. N'ezie, ọ bụ naanị nbudata nke ibe site na folda na kọmputa na nchekwa data ka agbakwunyere ebe a (nke, n'ụzọ, adịghị arụ ọrụ na nsụgharị a, n'ihi njikọ njikọ na-ezighị ezi).

Isi nke 2

Mgbe m nwalechara ihe nkesa ahụ, abịara m na nke a ga-abụ ezigbo ngwọta (onye nbibi: mba), maka ọrụ anyị, ya mere, ọrụ ahụ malitere inweta ezi uche.
Nzọụkwụ site na nzọụkwụ, modul ọhụrụ malitere ịpụta na ọrụ nke ihe nkesa na-eto eto. Ihe nkesa ahụ enwetala ngalaba ule yana nzuzo njikọ ssl.

Obere koodu ọzọ na-akọwa mgbagha nke ihe nkesa na nhazi nke ndị ahịa
Ụdị ihe nkesa emelitere, gụnyere iji asambodo.

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

yana onye njikwa ahịa ọhụrụ nwere ikike site na 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);
}

}
}

Mana ebe ọ bụ na ihe nkesa na-arụ ọrụ naanị na njikọ TCP, ọ dị mkpa ịmepụta modul nke nwere ike ịmata ọnọdụ arịrịọ. Ekpebiri m na parser dabara ebe a nke ga-emebi arịrịọ onye ahịa ahụ n'ime akụkụ dị iche iche nke m nwere ike iji meekọrịta ihe iji nye onye ahịa azịza ndị dị mkpa.

ihe nzacha

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

Ihe kachasị mkpa ya bụ n'eziokwu na site n'enyemaka nke okwu mgbe nile iji mebie arịrịọ ahụ n'ime akụkụ. Anyị na-enweta ozi n'aka onye ahịa, họrọ ahịrị mbụ, nke nwere usoro na arịrịọ url. Mgbe ahụ, anyị na-agụ nkụnye eji isi mee, nke anyị na-ebuba n'ụdị ụdị HeaderName = Ọdịnaya, ma chọtakwa, ọ bụrụ na ọ bụla, ọdịnaya na-esote (dịka ọmụmaatụ, querystring) nke anyị na-ebuba n'ime nhazi yiri ya. Na mgbakwunye, onye nyocha na-achọpụta ma ọ bụrụ na onye ahịa ugbu a nwere ikike ma chekwaa data ya. Arịrịọ niile sitere n'aka ndị ahịa enyere ikike nwere hash ikike, nke echekwara na kuki, ekele nke enwere ike ikewapụta mgbagha ọrụ ọzọ maka ụdị ndị ahịa abụọ wee nye ha azịza ziri ezi.

Ọ dị mma, obere ihe mara mma nke kwesịrị ịkwaga na modul dị iche, na-atụgharị arịrịọ dị ka "site.com/@UserName" ka ọ bụrụ ibe ndị ọrụ emepụtara ike. Mgbe hazie arịrịọ ahụ, modul ndị a na-abata.

Isi nke 3. Ịwụnye njikwa aka, na-agba mmanụ mmanụ

Ozugbo parser ahụ mechara, onye na-ahụ maka ya na-abata, na-enye ntụziaka ndị ọzọ na ihe nkesa na-ekewa njikwa n'ime akụkụ abụọ.

mfe njikwa

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

N'ezie, enwere naanị otu nlele maka ikike onye ọrụ, mgbe nke ahụ gasịrị, nhazi arịrịọ na-amalite.

Ndị njikwa ahịa
Ọ bụrụ na onye ọrụ enyeghị ikike, mgbe ahụ maka ya ọrụ ahụ dabere na ngosipụta nke profaịlụ onye ọrụ na windo ndebanye ikike. Koodu maka onye ọrụ ikike na-ele anya otu ihe ahụ, yabụ ahụghị m ihe kpatara m ga-eji megharịa ya.

Onye ọrụ enweghị ikike

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;

}

}

}
}

Na n'ezie, onye ọrụ ga-enweta ụfọdụ ọdịnaya nke ibe, ya mere maka azịza e nwere ndị na-esonụ modul, nke na-ahụ maka ịza arịrịọ maka akụrụngwa.

Onye njikwa ode akwụkwọ

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

Mana iji gosi onye ọrụ profaịlụ ya na profaịlụ nke ndị ọrụ ndị ọzọ, ekpebiri m iji RazorEngine, ma ọ bụ karịa akụkụ ya. Ọ gụnyekwara ijikwa arịrịọ ọjọọ yana ịnye koodu njehie dabara adaba.

Onye njikwa Razor

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

Na n'ezie, ka nkwenye nke ndị ọrụ ikike ịrụ ọrụ, ikike dị mkpa. Modul ikike na-emekọrịta ihe na nchekwa data. A na-enyocha data enwetara site na ụdị dị na saịtị ahụ site na ọnọdụ, echekwara onye ọrụ wee nata kuki na ịnweta ọrụ na nloghachi.

modul ikike

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

Ma nke a bụ ka nchekwa data dị ka:

Database

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


Na ihe niile na-arụ ọrụ dị ka clockwork, ikike na ọrụ ndebanye aha, kacha nta ọrụ nke ịnweta ọrụ adịlarị na ọ bụ oge dee ngwa na kechie ihe niile na isi ọrụ nke ihe niile na-eme.

Isi nke 4

Iji belata ụgwọ ọrụ nke ịde ngwa abụọ maka ikpo okwu abụọ, ekpebiri m ịme cross-platform na Xamarin.Forms. Ọzọ, ekele maka eziokwu na ọ dị na C #. N'ịbụ onye mere ngwa nyocha nke na-ezigara data na ihe nkesa, agbagara m otu oge na-adọrọ mmasị. Maka arịrịọ sitere na ngwaọrụ ahụ, maka ihe ọchị, etinyere m ya na HttpClient wee tụba ya na sava HttpRequestMessage nke nwere data sitere na ụdị ikike na usoro json. Na-atụghị anya ihe ọ bụla, m meghere ndekọ ihe nkesa wee hụ arịrịọ sitere na ngwaọrụ ahụ na data niile dị n'ebe ahụ. Ụjọ na-acha ọkụ, ịma ihe niile emere n'ime izu 3 gara aga nke mgbede siri ike. Iji lelee izi ezi nke data ezigara, akpọkọtara m ihe nkesa ule na HttpListner. N'inweta arịrịọ na-esote ugbua na ya, ewepụrụ m ya na ahịrị koodu abụọ, nweta data KeyValuePair site na ụdị ahụ. Ntụle ajụjụ ebelatala ahịrị abụọ.

Amalitere m ịnwale ọzọ, ekwughị ya na mbụ, mana na sava gara aga, m ka mebere nkata etinyere na websockets. Ọ na-arụ ọrụ nke ọma, mana ụkpụrụ nke mmekọrịta site na Tcp na-akụda mmụọ, a ga-emepụta ọtụtụ ihe ka ukwuu iji wuo mmekọrịta nke ndị ọrụ abụọ na ntinye akwụkwọ ozi. Nke a na-agụnye ịmegharị arịrịọ maka ngbanwe njikọ na ịnakọta nzaghachi site na iji usoro RFC 6455. Ya mere, na ihe nkesa ule, ekpebiri m ịmepụta njikọ weebụ dị mfe. Naanị maka mmasị.

Njikọ nkata

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

Ọ rụkwara ọrụ. Ihe nkesa ahụ n'onwe ya guzobe njikọ ahụ, mepụta igodo nzaghachi. Enweghị m ọbụna ịhazi ndebanye aha nkesa iche iche site na ssl, o zuru ezu na usoro ahụ enweelarị asambodo arụnyere na ọdụ ụgbọ mmiri achọrọ.

N'akụkụ ngwaọrụ na n'akụkụ saịtị, ndị ahịa abụọ gbanwere ozi, ihe a niile abanyela. Ọ nweghị nnukwu parsers na-ebelata ihe nkesa ahụ, ọ nweghị nke a chọrọ. Ebelatala oge nzaghachi site na 200ms ruo 40-30ms. M wee mee naanị mkpebi ziri ezi.

Ịnya igwe dị elu ma ọ bụ ngwa nkesa ahịa dabere na C # .Net framework

Tụpụ mmejuputa ihe nkesa dị ugbu a na Tcp wee degharịa ihe niile n'okpuru Http. Ugbu a, oru ngo dị na ọkwa nke redesign, ma dị ka kpamkpam dị iche iche ụkpụrụ nke mmekọrịta. A na-emekọrịta ọrụ nke ngwaọrụ na saịtị ahụ na debugged ma nwee echiche a na-ahụkarị, yana naanị ihe dị iche na ngwaọrụ adịghị mkpa ịmepụta ibe html.

nkwubi

"N'amaghị ford, etinyela isi gị n'ime mmiri" Echere m, tupu ịmalite ọrụ, m kwesịrị ịkọwapụta nke ọma ihe mgbaru ọsọ na ebumnobi, yana banye n'ime ọmụmụ nke teknụzụ dị mkpa na ụzọ maka mmejuputa ha na ndị ahịa dị iche iche. Ihe oru ngo a na-erula ngwụcha, mana enwere ike m ga-alọghachi ikwu maka otu m siri mebie ihe ụfọdụ ọzọ. Amụtara m ọtụtụ ihe n'oge usoro mmepe, mana enwere ọtụtụ ihe m ga-amụta n'ọdịnihu. Ọ bụrụ na ị gụọla nke a, daalụ maka ịgụ akwụkwọ.

isi: www.habr.com