- iPhone topik
- Megérkezett a Google Pixel 7 és 7 Pro
- Samsung Galaxy Watch7 - kötelező kör
- Samsung Galaxy Watch6 Classic - tekerd!
- Mobil flották
- Milyen okostelefont vegyek?
- Redmi Note 13 Pro 5G - nem százas, kétszázas!
- Google Pixel 9 Pro XL - hét szűk esztendő
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- One mobilszolgáltatások
Új hozzászólás Aktív témák
-
bandi0000
nagyúr
Kicsit elakadtam a multiple file feltöltésnél
A gond az, hogy hiába adom meg az endpointnak, hogy kapni fog egy ViewModel-t amiben van egy List<IFormFile> és egy String path
Erre kapok egy 400-as hibát miszerint: The JSON value could not be converted
Frontenden küldök egy files: FormData amihez hozzáfűztem a filokat, illetbe egy path: string-et
Ha viszont csak a FormData-t küldöm, akkor a backenden a Request.Form.Files-ben látom a filokat, de akkor meg nincs meg a path
A Request.Form.Files egy IFormCollection-t ad vissza, viszont ha ezt állítom be a ViewModel-ben típusban, akkor meg az a baja, hogy nem támogatja ezt
Ezt hogyan kellene megoldani?
-
kkdesign
senior tag
Sziasztok!
Azt szeretném kérdezni, hogy dolgozik valaki esetleg DevExpressel?
WPFhez használok több controllját, és az egyik diagramnál nem jutok vele dűlőre. Van valaki akinek van abban tapasztalata? -
bandi0000
nagyúr
FileSystem megvalósításába kezdtem, végülis maradtam a lokálisnál, mert erre a demo projektre tökéletes lenne, és ingyen van
Viszont arra tudtok tippet adni, hogy hogyan kellene beolvasnom file-t?
Valami olyan dolog kellene, aminél nem számít a típus, kép, szöveg, pdf bármit beolvas, és konvertálja base64 stringgé. amit majd visszaadok a frontendnek
-
kingabo
őstag
-
zsolti_20
senior tag
Üdv emberek! Szeretnék írni egy programot, ami egyszerűnek tűnik de közben nem találok rá logikus lépéseket a megoldás felé.
Van egy excel file-m ahol A oszlopban van több tízezer sor. Kb 40ezer sorról beszélünk. Az A oszlopban lévő sorok mellett a B oszlopban találhatóak a hozzá tartozó értékek.
Lehetséges olyan formot készíteni ahol megadom az A oszlophoz tartozó B oszlopban lévő értéket és csak azt listázza ki amelyikben megtalálható ez az érték?
Készítettem egy példa fájlt:
[link]
Szóval szeretnék egy formot ahová betallózhatom az excel filet. Ezen a formon lenne egy filter szerűség ahol kilehet pipálni a B cellákban lévő értéket. És csak az maradna meg, azt listázná ki nekem amiben csak ez az érték található meg, semmi más.
Pl ha én kiválasztom hogy 547,125 akkor kilistázza nekem az 5-öt.
Vagy ha pl a 356-ot akkor a 9-et és a 4-et.
414-nél csak a 8-nek kellene megjelennie, mert az 1 az tartalmazza a 414-et de valami mást is.
Van valakinek ötlete hogy valósítható ez meg? -
Keem1
veterán
Skacok, algoritmus segítségre lenne szükségem. A Timert és a DateTime-t kellene kombinálnom úgy, hogy az Interval pontosan kétóránként (páros óránként), 0 perc 0 másodperckor legyen.
Kézenfekvő lehetne, ha eleve 0 perc 0 másodperckor indítanám, de az emberi erőt igényel.
Másik megoldás, hogy mondjuk másodperceként figyelem és ha 0 perc 0 másodperc, akkor "elérkezett az idő", de ez meg eléggé igénytelen és erőforráspazarló is.Szóval valami olyasmiban látnám a megoldást, hogy kezdéskor következő egész óra - az adott idő az interval, majd utána már 2 órának megfelelő ms.
Erre esetleg valami elegáns, hatékony és logikus ötlet?
A kód service-ként, szerveren fog futni (Raspberry Pi, Linux, mono-service-ként indítva).
-
Jokerpoker
csendes újonc
Sziasztok!
Visual Studióban csináltam egy Form-ot amin van egy ProgressBar egy DataGridView és 4 gomb azt szeretném elérni, hogy bárhogy változtatom a Form-nak a méretét ezeknek az elemeknek is változzon vele a mérete és a pozziciója is.(Bármekkora méretű ablakban / monitrorn ugyanúgy nézzen ki arányokban)
Előre is köszönöm a válaszokat! -
martonx
veterán
válasz
joysefke #9188 üzenetére
Pedig ez akkor is tipikusan olyan, amit semmi értelme tesztelni. Több idő, és macera teszteket készítened, ahhoz hogy leellenőrizd, hogy működik az, ami nyilvánvalóan működik.
Mondok egy példát:
public int Add(int a, int b)
{
return a + b;
}Elméletileg ezt is kellene tesztelned, de őszintén minek, pláne, hogy C#-ról beszélünk nem javascriptről, ahol ezt simán meghívhatod stringekkel is? Ha már endpointokat akarsz tesztelni, akkor azt teszteld, hogy model binding biztosan jól kezel-e le mindent, ne a TÖKÉLETESEN nyilvánvalót, miszerint ha meghívod a /Home/Index-et, akkor vajon melyik endpointba fog beesni.
Direkt sarkítottam, lehetnek trükkösebb routingok, amiket utána meg pláne még fájdalmasabb lesz tesztelni, miközben azok is a legelső meghíváskor ki fognak derülni, ha működnek, ha nem akkor javítod, és utána az ítéletnapig jó lesz.
Ráadásul kevered a unit teszt-et, a system test-tel. http://softwaretestingfundamentals.com/software-testing-levels/
Ne érts félre, nem kötözködni akarok, csak ha már precízen tesztelni akarsz - ami nagyon helyes hozzáállás - akkor olyanra fordítsd az erőforrásodat, aminek van értelme
-
joysefke
veterán
ASP NET Core 3.1, WebAPI
RESTful projekt elején vagyok, előreláthatóan lesz jó pár kontroller/actionmethod, illetve már van url alapú verziózás is. A routing controller/action-method -attribútumokkal van vezérelve.
Szeretném unit-tesztekkel ellenőrizni, hogy egy adott request Uri-hoz a routing azt a kontrollert illetve annak azt az action metódusát hívja meg, amit én gondolok.
Erre van valami bevált egyszerű megoldás?
Előre is köszönöm a válaszokat
J. -
martonx
veterán
-
Keem1
veterán
válasz
Jokerpoker #9182 üzenetére
Szerintem nem magára az adatbázisfájlra, hanem az adatbáziskezelő rendszerre gondolt. Nem ismerem a LocalDB-t, de pl. MySQL-nél telepíteni kell az adott gépre (vagy csatlakozni a távoli szerverhez), az SQLite esetén meg kell az a dll, ami maga az adatbáziskezelő rendszer.
De nem ismerem a LocalDB-t, fogalmam sincs, hogy épül fel és mi kell hozzá.
-
martonx
veterán
válasz
Jokerpoker #9175 üzenetére
Nyilván nincs LocalDB azon a gépen
-
Keem1
veterán
válasz
Jokerpoker #9178 üzenetére
Nem biztos hogy igazam van, de a current working path lekérdezése nekem nem tetszik.
Megpróbálod a tiéd helyett ezzel? System.Environment.CurrentDirectory -
Jokerpoker
csendes újonc
válasz
lord.lakli #9176 üzenetére
+@cattus
A másik gépen a mappában ezek a fájlok vannak: [kép]
Az első a database fájl. -
cattus
addikt
válasz
Jokerpoker #9175 üzenetére
A másik gépen nem létezik a LocalDB, amiből kiolvasná az adatokat.
-
lord.lakli
őstag
válasz
Jokerpoker #9175 üzenetére
Nincs ott a LocalDB vagy más néven szerepel.
-
Jokerpoker
csendes újonc
Sziasztok!
Visual studioval csináltam egy programot ami egy LocalDB-ből teszi be az adatokat egy gombnyomásra a DataGridWiew-ba. A program teljesen jól működik a saját gépemen, de amikor átviszem egy másik gépre és megpróbálom betölteni az adatokat, ezt a hibaüzenetet kapom: [kép]
Mi lehet a gond?
Köszönöm bárkinek aki tud segíteni! (ha nem jó a topic irányítsatok át másikba) -
Keem1
veterán
Ez az, így van, sikerült is, sőt, kibővítettem úgy, hogy magába a Test osztályba tettem be a metódusokat, megfejelve azzal, hogy void helyett string a visszatérési értéke.
Nagyon köszi az útmutatást
public static class Test
{
public static string Add(string input)
{
return input;
}
public static string ToConsole(this string text)
{
Console.WriteLine(text);
return text;
}
public static string ToFile(this string text, string FilePath)
{
try
{
System.IO.File.AppendAllLines(FilePath, new[] { text }, System.Text.Encoding.UTF8);
}
catch { }
return text;
}
} -
dqdb
nagyúr
Most nézem, hogy az első metódus a hozzászólásomban az
Add
helyettToConsole
lett volna, ha nem írom el ... szóval helyesen:public static class StringExtensions
{
public static void ToConsole(this string text)
{
Console.WriteLine(text);
}
}
public static class Test
{
public static string Add(string input)
{
return input;
}
}Az a lényeg, hogy te egy string példányon szeretnél saját metódust hívni, így a String osztályt kell saját metódussal bővítened. Az egész megoldás a syntactic sugar kategóriába tartozik mert ez:
Test.Add("blabla").ToConsole();
a háttérben valójában erre fordul le:
StringExtensions.ToConsole(Test.Add("blabla"))
-
Keem1
veterán
Srácok, van egy statikus ojjektumom (nevezzük most Teszt-nek), annak pedig egy fő metódusa:
string Add(string data)
Az esetek többségében a használata:string EzLeszAValtozo = Teszt.Add("ide írok valamit");
Viszont szükségem lenne egy olyan megvalósításra, hogy:
Teszt.Add("ide írok valamit").ToConsole();
Mely esetben az Add metódus string visszatérési értéke továbbmenne a ToConsole() metódusnak és abban csak annyi lenne, hogy Console.WriteLine(AzAddMetódusVisszatérésiÉrtéke);
Addig vagyok meg, hogy
public static Teszt
{
public static string Add(string input)
{
return input;
}
}Szóval valahogy a ToConsole metódust kéne kiviteleznem, de nem tudom hozzáfűzni az Add()-hoz. Lesz még ToFile(), ToMySql(), stb. de ha megvan a method chaining, szerintem a többivel már boldogulni fogok. A lényeg az, hogy az Add() visszatérési értéke átkerülhessen egy másik metódus bemenetére.
-
Keem1
veterán
válasz
bandi0000 #9167 üzenetére
Igen, közben rátaláltam erre, már beleástam magam
Köszönöm a linket!
Persze, kiválóan tudok angolul(egy nagy amerikai multinál dolgozom, ahol az 5 körös interjúból 4,5 volt angolul és napi szinten van szükség rá).
#9168 martonx:
Köszi, ezt megérdemeltem a lustaságom miattAmúgy ez a Mukesh Kumar féle szösszenet tényleg eléggé összeszedve mutatja a pro-kontra, meg összehasonlítási oldalról.
-
martonx
veterán
-
Keem1
veterán
Srácok, annyi technológia van már, kezdem elveszve érezni magam. Tudom, a net tele van leírással, de ha valakinek van kedve és 5 perce, nagyon leegyszerűsítve, csupán pár mondatban, leírná, hogy mi a különbség a .Net Framework, a .Net Core és a .Net Standard között?
Ez utóbbiról most hallottam először, miután egy NuGet package telepítése közben kiírta nekem, hogy nem kompatibilis ez a cucc az én projektemmel. A .Net Core-ról halvány sejtelmeim vannak, kb. egy új, platformfüggetlen csapásiránynak vélem. És mint a fentiekből kiderült, eddig a .Net Framework-kel kerültem kapcsolatba (amit eddig a pillanatig csak .Netként aposztrofáltam).Mivel nem teljesen témába vágó a kérdés, és kicsit redundáns is, megértem, ha válasz nélkül hagyjátok. De ha mégis vállalná valaki, hogy tényleg leegyszerűsítve, a különbségekre, előnyökre helyezve a hangsúlyt megválaszolná, annak megköszönöm.
Ha nem kapok válasz, akkor majd túrom a netet, úgyis megtalálom. Csak nekem ez a közösség eléggé szimpatikussá vált, sokat segítettetek eddig egy laikusnak (azt már sokszor mondtam, hogy ugyan kicsit konyítok hozzá, de nem vagyok programozó). -
wmarci
senior tag
Sziasztok!
Tudna esetleg segíteni valaki egy középiskolás verseny C# feladatban? Hogyan kellene elindulni benne és miket érdemes használni hozzá? Ha valaki tudna, akkor privátban megkeresném.
Köszönöm
-
coco2
őstag
Sziasztok!
Visual Studio alatt unit tesztben adok neki egy ilyet:
Assert.AreEqual<System.Boolean>(
true, false, "hello unit test");
A solution alatt van ugyan "TestResults" / "Gépnév-időpont" / "Out" mappa, de üres. A VS sem írt vissza semmit. Hova lett a "hello unit test"-em?
VS 2015 Enterprise. Nem járja nekem, hogy unit test result-om legyen?
-
wollnerd
aktív tag
Sziasztok!
Nem értem a backgroundworkert és a folyamatjelző működését! Pontosabban nem értem hogy miért van az hogy ha a projektemben nulláról próbálom megalkotni a BW-t, azt a hibát dobja mindig: Ez a BackgroundWorker folyamat azt állítja, hogy nem jelenti az előrehaladást. Módosítsa a WorkerReportsProgress tulajdonságot, hogy jelentse az előrehaladást.
Miközben kódról-kódra pontosan próbálom másolni 100 tutoriából, mindig ez a hiba, de ha egy letöltött projektet indítok el, ott tökéletesen müködik pedig a kódom szinte ugyanaz és nálam mégsem működik!Valaki megmagyarázná hogy miért van? Biztos h én vok a hülye.... Köszi előre is. (Scripteket próbálok a BW-el lefuttatni és a folyamatcsik jelezné hol tart jelenleg a folyamat.)
A projektem kódja: (Elnézést a hosszú tartalmáért. Használom a forráskód gombot, remélem bevállik.)private void BnWebElemStart_Click(object sender, EventArgs e)
{
if (!hatterbenDolgozo.IsBusy)
{
hatterbenDolgozo.RunWorkerAsync();
Richtbstatus.SelectionColor = Color.Blue;
Richtbstatus.SelectedText = "A Wappalyzer scripje 5 másodpercentként küldi a visszajelzését. A Sitespeedo 10 másodpercenként. A többi tool x mp-ként.";
Richtbstatus.SelectedText = Environment.NewLine + "A Sitespeedo elemzése tart a legtovább...";
Richtbstatus.SelectionColor = Color.Black;
}
}
private void Richtbstatus_TextChanged(object sender, EventArgs e)
{
Richtbstatus.SelectionStart = Richtbstatus.Text.Length;
Richtbstatus.ScrollToCaret(); //'Autogörgetés az aljára' mendódus mint a telepítővarázslóknál.
}
private void hatterbenDolgozo_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
//CHECK FOR CANCELLATION FIRST
if (hatterbenDolgozo.CancellationPending)
{
//CANCEL
e.Cancel = true;
}
else
{
Thread.Sleep(1000);
hatterbenDolgozo.ReportProgress(i);
}
}
}
private void hatterbenDolgozo_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
lbfolyamat.Text = e.ProgressPercentage.ToString() + "%";
}
private void hatterbenDolgozo_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
lbfolyamat.Text = "folyamat megszakítva.";
progressBar.Value = 0;
}
else
lbfolyamat.Text = "folyamat befejeződött.";
}
A letöltött projekt:private void cancelBtn_Click(object sender, EventArgs e)
{
//REQUEST CANCELLATION
backgroundWorker1.CancelAsync();
}
//RUN BG STUFF HERE.NO GUI HERE PLEASE
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
//CHECK FOR CANCELLATION FIRST
if (backgroundWorker1.CancellationPending)
{
//CANCEL
e.Cancel = true;
}
else
{
simulateHeavyJob();
backgroundWorker1.ReportProgress(i);
}
}
}
//THIS UPDATES GUI.OUR PROGRESSBAR
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
percentageLabel.Text = e.ProgressPercentage.ToString() + " %";
}
//WHEN JOB IS DONE THIS IS CALLED.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
display("You have Cancelled");
progressBar1.Value = 0;
percentageLabel.Text = "0";
}
else
{
display("Work completed successfully");
}
}
//SIMULATE HEAVY JOB
private void simulateHeavyJob()
{
//SUSPEND THREAD FOR 100 MS
Thread.Sleep(100);
}
-
Keem1
veterán
Hálás köszönet
Még valami!
Mivel eddig nem volt, Raspberry Pi-re fordítottam System.Data.SQLite binary-t. A NuGet a saját SQLite.Interop.dll-jét faszán megcsinálta: van egy x86 meg egy x64 mappa, benne a megfelelő dll, ugyanezen a néven. Ha az exe mellé hozzácsapom (a fenti két mappán kívül) az arm-es dll-t, akkor frankón működik. Viszont ez eléggé favágó megoldás. Ha létrehozok egy linux-arm mappát, és beleteszem a dll-t, nem találja (szól, hogy nincs ez a fájl). Rá tudom valahogy venni a Visual Studio-t, hogy "figyelj, van egy arm binary is, azt is használd"?Igen-igen, a tooljaimat már platformfüggetlenre írom. Minden faszán megy arm linux alatt is, kivéve - eddig - az SQLite. A favágó megoldással viszont már az is.
-
coco2
őstag
Sziasztok!
Segítséget kérnék. VS-ben solution-höz tartozó test project-ből ráhívnék olyan class-okra, amik bemeneti bináris file-okat használnak / mentenek (kell a normál működésükhöz). Az útvonallal kicsit vakarom a buksit.
Ha csak egy futó .exe lenne, akkor simán lekérdezném az assembly path-ot, és onnét relatívan elérném a dolgokat, de egy test solution esetében, hogyan tudok felderíteni környezetet / elérni bemeneti binárisokat?
-
Keem1
veterán
Srácok, float formázással kapcsolatban kérnék segítséget:
String.Format("{0:#0.0#}", WeatherData["main.temp"])
Mivel magyar a windows régióm, tizedesvessző lesz a stringben. Viszont ebben az egy esetben, tizedespontra lenne szükségem. Nem szeretnék regionális beállításokkal mókolni (mivel tényleg csak ez az egy eshetőség van, amikor változtatni kell), így kézenfekvő lenne, ha a formátumkóddal oldanám meg. Na de egyelőre nem találtam rá a megoldásra. -
-
kkdesign
senior tag
Sziasztok!
Egy olyan problémában szeretnék segítséget kérni tőletek ami lehetséges, hogy nagyon alap, de egyszerűen nem találok rá megoldást.
De próbálkozom megvalósítani (WPFben dolgozom ezzel)egyFejPartner = fejPartnerek.Where
(x => x.id == Bev_partner_comboBox.SelectedIndex).ToList() ;
Bev_cegnev_text.Text= egyFejPartner.First().cegNev;
Ennyi lenne igazából a kód.
A Következőt szeretném megvalósítani:
Egy Comboboxba töltöttem egy függvényen keresztül lista adatokat. Ez adatbázisból jön.
Azt szeretném, hogy az egyFejPartnerbe az az elem kerüljön be minden tulajdonságával, amelyiket a comboboxba kiválasztom. Ez most ami a kódban van, ez ugye nem jó, mert így az kerül bele, amelyik adatbázis béli ID megegyezik a selected indexel, az meg tök más. -
joysefke
veterán
válasz
petyus_ #9152 üzenetére
ha nyilvántartod a lezárt és nyitott éves-havi-heti-napi egyenlegeket, akkor egy esetleges visszamenőleges számlafelvétel kizárólag attól a dátumtól ahová beszúrtál tenné szükségessé a nyitott egyenlegek újraszámolását. 3 hétnél ez nem tűnik túl soknak.
egyébként egy lehetséges sebesség növekedést okozna, ha szegmensfa jellegű struktúrában tárolnád el a számlák intervallumokra levetített egyenlegeit. Ide O(logN) a beszúrás és O(logN) az összegzés költsége. Tehát lényegesen gyorsabb mint egy sima intervallum-összeg adott indexig típús adatstruktúra ahol egy közbenső beszúrás költsége ~logN
-
petyus_
senior tag
Sziasztok!
Tavaly kezdtem fejleszteni saját felhasználásra egy home budget appot (net core + angular), egy ideje már használom is, viszont van egy elég fontos kérdés, amit csak tolok magam előtt. A számlák egyenlegének kiszámítása. (tudom, létezik ezer ilyen, valószínűleg jobbak is, mint amit magamnak csinálok, de rengeteget tudok tanulni belőle, illetve volt már 1-2 feature, ami felmerült, hogy hasznos lenne, és máshol nem láttam.)
Jelenleg ez nincs eltárolva a db-ben, hanem a számla lekérésekor kiszámolom. Ez egyértelműen nem túl hatékony, egyelőre viszont működik, 10K+ rekordnál is megvan pár ms alatt. Ennek ellenére szeretném normálisan megoldani, illetve most felmerült egy új feature ötlete. Szeretném megjeleníteni a számlák egyenlegének alakulását egy grafikonon. Írtam egy brute force megoldást, de ez már most nagyon sokáig tart (kiszedek minden számlát a db-ből hozzájuk tartozó transactionökkel, megkeresem a legelső dátumot, onnan szépen végig kell menni, és hiába szűrnék mondjuk az tuolsó 30 napra, akkor is végig kell menni az összesen).
Alapból egyszerű lenne egy minden nap lefutó jobbal rögzíteni a rendszerbe az aznapi egyenleget, így az aktuális egyenleghez elég lenne lekérni az előző napi zárás, plusz az aznapi tranzakciókat (3 évnyi adatom van, összesen ~6K transaction, tehát napi 5-6). Viszont itt a dátum az nem feltétlen egyezik a hozzáadás dátumával, előfordul, hogy pl valamit elfelejtettem felírni, és 3 hét múlva utólag hozzáadom, illetve módosítani is lehet régebbi recordokat. Emiatt a napi egyszeri mentés az kevés sajnos.
Most épp az merült fel bennem, hogy lenne egy job, ami létrehoz minden számlához minden nap egy recordot, ahova lényegében átmásolja az előző napi értéket, és minden tranzakció insert/update/delete esetén végigmegyek a balance-okon, és újraszámolom őket. Viszont itt is felmerül, hogy ha pl 2 hónappal ezelőttre bekerül egy új érték, akkor egy sima add is sokáig tartana, mivel végig kell menni az elmúlt két hónap balance-ain.
Miközben írom, még az jutott eszembe, hogy esetleg lenne egy havi záró érték, és akkor gyorsabb lenne az add/update/delete, mivel ha aktuális hónapban vagyok, nem is kell semmit hozzáadni. Viszont a napi értékek megjelenítésével ezzel ugyanott vagyok.
Lenne esetleg valami ötletetek?
-
bandi0000
nagyúr
Tényleg bocs, hogy fárasztalak titeket a kérdéseimmel, de tanulok belőlük, szóval hálás vagyok érte mindenkinek
Megcsináltam az ajánlott exception handlert, ami viszonylag jól is működik, de olyat vettem észre, hogy pl én az exceptionnél csak egy ErrorDTO-t adok vissza ami tartalmaz egy Code-ot és egy Descriptiont
Na már most, ViewModelleknél használok attributomot, pl [Required] ez viszont a hibát így adja vissza:
+ Ha a Microsoft Identity pl duplikált emailt észlel, ő meg egy ilyen választ ad visszaNa már most frontenden, nem tudok végignavigálni a hibákon, mert mindegyik máshogy adja vissza, gondolom ezek is valamilyen exceptiont dobnak vissza, azt kellene megtudnom, hogy mit dobnak, és akkor azt fel tudom dolgozni, vagy esetleg teljesen más megközelítés kellene?
Vagy frontenden kellene erre valamit kitalálni?
-
boorit
csendes tag
Oké, ez tényleg működik a lista/táblázat frissítésre (és most, hogy írod, eszembe jutott, hogy ez tervben is volt, csak az elején az egyszerűség miatt csináltam úgy, ahogy most van), viszont a related entity változására még mindig nem jó.
Pl a létrehozott entity kapcsolódik egy másikhoz, legyen child, parent, one to many, és jelzem a parentnél a child-ok countját, ami nem egy static adat a DBben, hanem lekéréskor számolom ki. Ezt még mindig csak úgy tudom megoldani, hogy ha hozzáadok egy childot, akkor lekérem a parentet.
-
bandi0000
nagyúr
de a signalR is csak annyit mondana, hogy figyu vàltoztak az adatok, de pl akkor ugyan úgy be kellene húznod a táblàzatba , és hogy megmaradjanak a szűrt adatok, paginált adatok, akkor ugyan csak tudnia kell a szervernek, hogy honnan.adjon hàny adatot
vagy még azt lehet, hogy ahogy elküldöd a postot, vissszajött pl egy success, akkor megint lekérdezed a táblàzat adatait
-
boorit
csendes tag
válasz
bandi0000 #9145 üzenetére
Hát nem tudom, nekem a post az az éppen létrehozott objektumot adja vissza, put a módosítottat, delete NoContent-et. És ez a lista visszaküldés azért sem működne, mert pl be van állítva egy szűrő a táblázatra, akkor azt akarom, ha mondjuk törlök valamit, akkor a táblázatban a szűrt adatok maradjanak meg, aktuális oldal stb. Ez viszont csak úgy működhetne, hogy a requestben elküldöm a szűrőket is, ami nekem nem tűnik jónak.
Az adatok egy felhasználóhoz kötődnek, tehát ha használnék is SignalR-t, csak egy client lenne, akit értesíteni kell.
-
bandi0000
nagyúr
Ilyenkor sztem azt szokták csinálni, hogy ahogy létrehozol egy újat, válaszba visszaküldöd a frissített adatokat/táblázatot, és akkor az új adatok szerint frissíted a frontendet
Persze, ha több felhasználó is szerkesztheti, és ugyan azt a táblázatot látják, akkor viszont valszeg SignalR lesz a megoldás, mert akkor muszáj valahogy értesíteni a többi felhasználót is az adatok változásáról
-
boorit
csendes tag
válasz
martonx #9138 üzenetére
Nem tudom mire gondolsz
. Van egy oldal, ahol egy táblázatom, amiben szerepelnek objektumok. Mellette pedig van egy form, amivel újat lehet létrehozni. Létrehozok egy újat, akkor meghívom a GETet, hogy frissüljön a táblázat (erre szeretném használni a signalR-t). Ez szerinted rossz pattern?
Egyébként pedig van egy global gomb az appban, amire kattintva feljön egy dialog, és innen is lehet létrehozni új objektumot, viszont mivel ez bárhonnan elérhető, ezért itt felesleges lehet a GET hívás, ha nem is látszik az adott táblázat. Persze lehetne erre is egy logika, hogy mikor hívja meg a GETet, más megoldást nem jut rá eszembe.
-
bandi0000
nagyúr
Megcsináltam az exception elkapást
Úgy működik, hogy dobom az exceptiont, és átalakítja egyedi státusz kódra és üzenetté
Viszont, lehet butaságot kérdezek, de így a böngészőbe a consolon mindig kapok egy HTTP 400 kódot (ezt adom vissza), viszont más weboldalakon nem látok ilyen hibaüzeneteket, azok Http 200-al térnének vissza + error message-el? Vagy én rontok el valamit?
-
martonx
veterán
Web Api + SPA esetben ugyanúgy, mint bármilyen más esetben. SignalR szól, hogy új adat van, ekkor fogod és lekéred az új adatot.
Vagy ha minimális az adat, akkor eleve a SignalR-el ki is küldetheted, de a SignalR alapvetően nem arról szól, hogy sok száz Kbyte adatot mozgass vele (régebben 32/64Kbyte volt a korlátja, nem tudom ez azóta nőtt-e), hanem hogy signal-okat küldjön a kliensnek.Viszont értelmezve a problémádat, nálad architekturális gondok vannak az SPA-dban
amire nem a SignalR lesz a megoldás.
-
boorit
csendes tag
Sziasztok!
Ha már úgyis feljött a SignalR, nekem olyan kérdésem lenne, hogy egy webapi-nál ezt hogy kell implementálni? Elég sokat kerestem, és nem találtam rá választ, kezdem azt gondolni, hogy amit én akarok, az nem megvalósítható.Tehát van egy webapi-m, ami kiszolgál egy SPA-t. Jelenleg az app indításakor meghívok egy endpointot, ahonnan visszakapom a kért adatokat. Viszont néha egy másik entity változása miatt ezek változhatnak, ilyenkor azt csinálom, hogy megy a POST, és utána megint meghívom a GETet az első endpointra, viszont így pl sokszor olyankor is meghívom, amikor nincs is rá szükgségem (pl az a component jelenleg nem is szerepel az oldalon, de mivel a state kezelés úgy van megoldva, hgoy a post után hívja meg a get-et, ezért minden esetben meghívódik). Ezt szeretném valahogy SignalRrel kiváltani, elkerülve a felesleges callokat.
Nem konkrét implementáció érdekel, csak hogy egy REST APIra, hogy an lehet ezt megoldani.
-
bandi0000
nagyúr
Használta már valaki ezt a SignalR-t ?
Egy másik projekten belül gondolkozok ezen, igazából Android appot akarok majd, ott van ugye a Firebase Real Time database, ami tök jól használható, viszont külön nem kell írni baíckendet, ezért gondoltam erre, hogy így legalább lehetne mutatni, hogy én csináltam
-
martonx
veterán
Nagyon helyes, hogy régi elavult dolgokat (ami már új korában is szar volt, a fent részletezett okok miatt) nem támogatnak.
Ha szerver komponens is kell, akkor használj .Net Framework-öt.Egyébként már annyiszor mondtam: Miért nem használod a hivatalos dokumentációt??? Van ott WCF tutorial is, direkt nem vagyok hajlandó idelinkelni a kézenfekvőt.
-
dqdb
nagyúr
válasz
bandi0000 #9130 üzenetére
De most ez a megoldás nem rosszabb, mintha csak csinálnék pl egy osztályt, amibe van egy error és esetleg egy status code tulajdonság amit mindig visszaadok?
Ha kizárólag webes felületet nyújtasz, akkor szerintem ez az exception + middleware páros a legjobb.Ha vegyes felvágott a helyzet, mint nálunk, ahol webes és MQ felület is előfordul, akkor más a helyzet. Ezeknél az adott API implementációból az általad kérdezetthez hasonló üzenet jön ki, az API által dobható exceptionök kezelése belül megtörténik:
public class SomeResponse : IResponse
{
public string RequestID { get; set; }
public class OK : SomeResponse
{
public string SomeData { get; set; }
}
public class FailedBecauseOfThis : SomeResponse, IFault
{
public int Code { get; set; }
public string Message { get; set; }
}
public class FailedBecauseOfThat : SomeResponse, IFault
{
public int Code { get; set; }
public string Message { get; set; }
}
}Proto:
message SomeResponse {
string RequestID = 127;
oneof subtype {
SomeResponseOK OK = 1;
SomeResponseFailedBecauseOfThis FailedBecauseOfThis = 2;
SomeResponseFailedBecauseOfThat FailedBecauseOfThat = 3;
}
}
message SomeResponseOK {
string SomeData = 1;
}
message SomeResponseFailedBecauseOfThis {
int Code = 1;
string Message = 2;
}
message SomeResponseFailedBecauseOfThat {
int Code = 1;
string Message = 2;
}Sikeres válasz:
{
"some_data" : "data"
}Hibás válasz:
{
"code": 123,
"message": "blabla"
}Aztán ha MQ-n keresztül érkező kérésről van szó, akkor a teljes
SomeResponse
leszármazott megy vissza protobuf kódolással, ha webes kérésről van szó, akkor általában* egy réteg a hibákat a példány típusa és/vagy kód alapján megfelelő 4xx/5xx státuszkódokra mappeli és a hibaüzenetet tartalmazó JSON-t ad vissza, ha sikeres volt, akkor simán JSON megy vissza (webes kéréseknél aRequestID
sem kerül bele a válaszba, csak a konvertálást, szerializálást, naplózást befolyásoló attribútumokat az egyszerűség kedvéért lehagytam).* általában, mert volt, hogy a 200 azt jelentette csak, hogy a szerver válaszolt, és ugyanúgy protobuf ment vissza a kliens felé
-
coco2
őstag
Én értem, hogy utáljuk a soap-ot, de azért had kérjek benne segítséget
Szóval van a wsdl.exe a developer console-on, az gyárt nekem egy server interface-t a wsdl-ből, amit elvileg a wcf serializálásra és deserializálásra használt. Sajnos a net tele van olyan blogokkal, mint ez itt: [link] (a link már "nem él": "MSDN and TechNet blog sites have been retired, and blog content has been migrated and archived here"). Jó lenne valami példa kód, ami még nem halott link
Pld van egy stringem (soap boríték), amit szét szeretnék parsingolni osztályváltozókba, illetve osztályváltozókból soap borítékot építenék, és string kimenet kellene további feldolgozáshoz.
Milyen támogatásom van arra?
-
bandi0000
nagyúr
válasz
petyus_ #9129 üzenetére
Most lehet félreértelek, de pl ha csinálok több Exceptiont pl LoginException és ha rossz ugye a username vagy jelszó, akkor dobok egy ilyen exceptiont amit elkapok egy [ilyen] middleware-rel, és a hibaüzenetet átalakítom olyanra amit frontenden le tudok kezelni
Most, hogy gondolkozok, úgy emlékszek a szakmai gyakon is Java spring-ben, mindig exceptiont dobtunk, ami át lett alakítva
De most ez a megoldás nem rosszabb, mintha csak csinálnék pl egy osztályt, amibe van egy error és esetleg egy status code tulajdonság amit mindig visszaadok?
-
petyus_
senior tag
válasz
bandi0000 #9127 üzenetére
Ha nem jó a user/pass, akkor 401. 400 akkor, ha valami gond van a requesttel (pl nem küldött pass-t, csak usert).
Loginnál jellemzően elég egy string, hogy invalid username or pass. (azért nem invalid username, meg külön invalid pass, hogy így ne lehessen kinyerni a username-eket).
Registernél jó kérdés, hogy mi a jó statuscode már létező userre, [link] itt pl megy a vita, hogy jó-e a 409 (conflict), de fel is sorolja valaki, hogy a FB/Google/stb mit küld. Én 400-at küldenék, mert ugyan nem client hiba, de neki kell változtatnia a requesten ahhoz, hogy jó legyen.
A hibakezelésnek meg nézz utána, core-ban (nem tudom milyen verziót használsz, azt hiszem 2.2-től, de lehet, hogy csak 3.0-tól) van egy ProblemDetails classt, ezt generálja ha validationError van. Ha túljut a validationön (ha csak az a gond, hogy már létezik ilyen felhasználó, akkor túljut), akkor megnézed, hogy van-e ilyen user, ha van, akkor a ModelState-hez adj hozzá hibát, és az mehet vissza, majd a framework csinál belőle problemdetailst (ez egyébként szabány [link] ).
AVagy ha feleslegesen bonyolult neked a problemdetails, akkor csinálj egy saját error-handlert (action filter, vagy middleware), ahol olyan response-t csinálsz, amilyet akarsz, amit egyszerűen tudsz kezelni frontend oldalon.
-
coco2
őstag
válasz
martonx #9118 üzenetére
WCF-re rákerestem, és ilyesmit találtam: [link]
Then came .NET Core and the story changed: WCF was not here, or, to be precise, there was no server-side WCF, only client-side, meaning, you could write a WCF proxy to access aSOAP or REST web services, but you could not implement one.
Nekem szerver komponens is kell
-
bandi0000
nagyúr
Rest API-nál mik a konvenciók nagy vonalakban a visszatérési értékeknek?
PL amin most fennakadok, hogy bejelentkezésnél visszatérek egy Ok()-al, és a jwt tokennel
Viszont, ha nem jó a felhasználónév vagy jelszó, akkor BadRequest-tel térjek vissza, vagy egy Ok()-al amibe rakok egy osztályt amibe benne vannak a hibával kapcsolatos dolgok?
Frontenden valami olyasmit akarok válaszban, hogy tudjam, pl hogy a felhasználónév a rossz, vagy a jelszó, illetve regisztrálásnál is jó lenne tudni, hogy létezik e már ilyen felhasználó stb
-
martonx
veterán
a gRPC nyelv független szabvány. A google kezdte el, szóval nagyon nincs köze .Net-hez
Az Odata is nyelv független, bár az MS kezdeményezés, nem tudom mennyire terjedt el más nyelveken.
A REST API, meg aztán végképp független bármilyen nyelvtől.A SOAP az úgy lett szabvány, hogy igaziból sose volt interoperábilis a nyelvek között, mert túl bonyolult volt, és ki így valósította meg, ki úgy. Mint a böngészők HTML5-ös szabvány követése 5 évvel ezelőtt. Ha próbáltál már PHP-s SOAP-ot .Net-el kezelni, és fordítva (de említhetném a java-t, vagy bármely nyelvet), akkor tudod miről beszélek
-
dqdb
nagyúr
Szép dolog a szabvány, ha azt nem bonyolítják túl. A SOAP és a köré épülő infrastruktúra azonban túlbonyolított erőteljesen, ha pedig hozzácsapod a WS-Security-t, akkor főleg az lesz nem egyértelműen definiált elemekkel a szabványban. Szép dolog, amikor a Java és a C# világ nem tud beszélgetni egymással egy szabványos felületen keresztül úgy, hogy mindketten támogatják azt, mert adott feature X opcionális lehetősége közül sikerült diszjunkt halmazt implementálni (például bináris adatok hatékonyabb átvitelére a csak MTOM-ot támogató WCF találkozik egy csak SwA-t támogató Oracle alkalmazásszerverrel).
JSON, grpc (protobuf alatt ezt is értettem) eléggé támogatott minden platformon, az utóbbi esetben a túloldal megkapja a .proto fájlokat az interfészleírás részeként, és tud vele szépen dolgozni.
-
martonx
veterán
Egyértelműen ez: https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-3.1
De ott van még a sima REST API vagy Odata.
Felejtsük már el végre az őskövület szarokat, amikor valami újat fejlesztünk.
GLS-en röhögtem nagyon jót, mikor idén év elején nagy lelkesen bejelentették, hogy végre vadonatúj API-juk van, ami immár WCF alapú
Váááá
Hülye elmaradott parasztok. Mondjuk az előző classic ASP-s API-jukhoz képest ugrottak vagy 15 évet előre, már csak másik 15 évet kellene ugraniuk -
Keem1
veterán
Bár lehet hogy nem a legjobb stratégia, de én szeretem azokat a technikákat előnyben részesíteni, amik szinte szabvánnyá váltak és a legtöbb helyzetben egyértelműek, elfogadottak. Pl. ezért használok XMLRPC-t. Elég világosan lefektetett szabályai vannak, szinte minden platformon implementálták és mindenhol ugyanúgy használható.
Az lenne a jó, ha ugyanez XML helyett JSON-ban lenne (elvileg van rá törekvés: JSON-RPC). -
-
coco2
őstag
Sziasztok!
Oktató anyag után nézelődöm.
Van egy wsdl + xsd, kellene belőle soap szerver + kliens skeleton fordulás és indulásképesen.
Környezet win10 / vs, c#. Gui-hoz nem ragaszkodom, háttérben elinduló web service + előtérben futó console app lenne az ideális.
Van ilyesmire blog / oktató videó lépésről lépésre? Nem a végeredmény a fontos, hanem a project építési folyamat, és hogy megértsem.
Előre is köszönöm.
-
cattus
addikt
Régen foglalkoztam már C#-pal, de tippre ott lesz a hiba, hogy a
Avr_Registers[] AVR_Regz =new Avr_Registers[256];
sorban csak egy üres tömb jön létre, nem lesznek benne az Avr_Registers objektumok, így annak a propertyjére sem tudsz hivatkozni. Ehhez először inicializálnod kell a tömb elemeit, még mielőtt hivatkozol rájuk:
for (int i = 0; i < AVR_Regz.Length; ++i)
{
AVR_Regz[i] = new Avr_Registers();
}
Ugyanitt tipp, hogy az osztályneveket egyes számban írd.
-
G.A.
aktív tag
Üdv!
Egy saját class-t szerettem volna létrehozni:
public class Avr_Registers
{
public string Name
{ get; set; }
public byte Value
{ get; set; }
public string[] Bit_Names
{ get; set; }
}
amivel már a teszt foo()-ban gondo akadt:public void AVR_Register_Test()
{
Avr_Registers[] AVR_Regz =
new Avr_Registers[256];
for (UInt64 i = 0; i < 0x08; i++)
{
AVR_Regz[i].Name = "Reg" + i.ToString(); << már itt hibát ir ki
AVR_Regz[i].Value = (byte)i;
for (byte b = 0; b < 8; b++)
{
AVR_Regz[i].Bit_Names[b] = "Bit" + i.ToString() + b.ToString();
}
write_to_uart_screen(AVR_Regz[i].Name + " value = " + AVR_Regz[i].Value.ToString() + "\r\n");
for (byte y = 0; y < 8; y++)
{
write_to_uart_screen(AVR_Regz[i].Bit_Names[y] + "\r\n");
}
}
}
A hiba:
"System.NullReferenceException: 'Az objektumhivatkozás nincs beállítva semmilyen objektumpéldányra.' "
Nem tudok a változóimnak (új) értéket adni.
A legidegtépőbb számomra, hogy akármilyen módon próbálom megoldani nem megy, pedig vagy egy tucat "referencia" kódot találtam a neten, amik leginkább erre a félépítésre hajaznak:
[link]A vicc, hogy van egy másik, egy array-változós class-om, ami meg simán megy, ahogy azt elképzeltem.
-
G.A.
aktív tag
válasz
bandi0000 #9110 üzenetére
Majdnem eltaláltad, csak fordítva.
Ha CheckedListBox_SelectedValueChanged() hívom meg, akkor utána NumUpDown_ValueChanged() is meg lesz hívva. Ez lehet a hiba forrása?
Talán egy if()-el megoldom, hogy akkor ne fusson le, ha a CheckedListBox_SelectedValueChanged() hívta a fv-t. Tesztelem is... -
G.A.
aktív tag
Üdv!
Egy NumUpDown számlálót (0-255) és egy 8 paraméterrel rendelkező CheckedListBox "értékeit" szeretném szinkronban megjeleníteni. Azaz ha egyiket módosítom, akkor a másik is változzon.
Ehhez Evenet interruptokat használok.
Ha a felhasználó a NumUpDown-t változtatja, akkor annak az Event interruptja megváltoztatja a CheckedListBox "értékeit".
A másiknál vica-versa, de itt már problémás a dolog. Néha megy, néha nem.private void NumUpDown_ValueChanged(object sender, EventArgs e)
{
byte temp = (byte)NumUpDown.Value;
for (int i = 0; i < CheckedListBox.Items.Count; i++)
{
CheckedListBox.SetItemChecked(i,IsBitSet(temp,i));
}
CheckedListBox.Refresh();
}
private void CheckedListBox_SelectedValueChanged(object sender, EventArgs e)
{
byte temp = 0;
for (int i = 0; i < CheckedListBox.Items.Count; i++)
{
if (CheckedListBox.GetItemChecked(i))
{
temp += (byte)Math.Pow(2, (i % 8));
}
}
NumUpDown.Value = (decimal)temp;
NumUpDown.Refresh();
}
A hibát leginkább úgy tudnám jellemezni, hogy akkor jön elő, ha túl gyorsan jelölöm be (vagy ki) a mezőket CheckedListBox-ban. Merre keressem a hibát?
-
martonx
veterán
válasz
joysefke #9105 üzenetére
Én ebbe nem folynék bele, mert azok alapján, amit leírtál két esetet tudok elképzelni:
1. ahol dolgozol, mindenki segg hülye, de azért szeretném hinni, hogy ennyire nem lehet rossz a helyzet
2. valamit végtelenül félreértesz az alatt, hogy a cég mit nevez inter kommunikációnakHa nem félreértés, és tényleg azt erőltetik, ami a leírásod alapján átjött, akkor meg ideje felmondani, és normális fejlesztő céget keresni
-
joysefke
veterán
válasz
martonx #9104 üzenetére
Mert nem tudom, hogyan/milyen alapon oldjam meg az inter-processz kommunikációt ha a REST-szervíz külön processzbe kerülne. A REST szerviz nem írhatja/olvashatja közvetlenül az adatbázist/adatbázisokat az összes hozzáférésnek mindenképpen keresztül kell mennie a jelenlegi alkalmazás logikán, ez elvárás.
Illetve akárhogy is lenne ez, ehhez mindenképpen hozzá kell nyúlni az apphoz (mivel a legacy interfészt nem használhatom), ezért gondoltam, hogy ennyi erővel akár egyből az applikációba bele lehetne rakni a REST szervízt.
Egyébként nem hiszem, hogy késleltetés/throughput szempontjából a kommunikáció túlságosan kritikus lenne (ha az lenne, akkor már a külső REST interfész is problémás lenne).
Tehát ha útba tudsz igazítani, hogyan oldjam meg minimális invázióval, hogy az applikáció a külön processzben futó REST-szervizzel tudjon kommunikálni, annak örülnék
Meg minden ötletnek ami jobb mint a jelenlegi.
-
martonx
veterán
válasz
joysefke #9103 üzenetére
"Az ötletem az, hogy a REST API egy ASP .NET Core 3.1 projekt lenne amelyhez tartozó ASP WebHost objektumot az applikációból (annak a belépési pontját megkeresve) egy külön Thread-en indítanám el, az pedig a megadott porton fogadná a kéréseket."
He? Hogy mi? Miért? Addig, hogy Asp.Net Core API teljesen értek mindent, de ez a kókányolás ötlet ez minek?
Simán elfut egy Asp.Net Core Api, megcsinálja, amit kell, és ennyi? Mindenki, mindenkitől függetlenül éli a világát.
Szakadjunk már el a görcsös monolitikus megvalósítástól, ez pont az a helyzet, ahol nyugodtan be lehet vezetni egy független microservice asp.net core api-t. -
joysefke
veterán
Sziasztok, szeretnék inputokat gyűjteni meg hátha segít ha leírom a gondolataimat.
Van egy nagy alkalmazás amelynek a fejlesztésébe (elsőként) belecsöppentem, további szerencsések majd csatlakoznak. Az én feladatom viszonylag beláthatónak tűnik: RESTful Api-t kell írni az alkalmazás által managelt objektumok lekérdezéséhez és módosításához. A távlati terv az, hogy ezzel a Rest-Apival kiváltsák a meglévő legacy interfészt amit a kliensek használnak.
A megvalósítandó REST-interfész Swagger szinten már kb definiálva van, nekem "csak megvalósítani" kell, vagy legalább érdemben elindulni az úton és kompetencia benyomását kelteni. A megvalósításhoz én minél kulcsrakészebb technológiát akarok használni, ahol minél több HTTP/REST/Auth dologhoz van gyári támogatás. Szóval ASP Core API projekt lebeg a szemem előtt. A fő kérdés az, hogy ezt hogyan fogom a jelenlegi monstrumba beleintegrálni anélkül, hogy közben újra fel kéne találnom a csillagrombolót vagy esetleg a kőbaltámmal tönkretenném az említett csillagromboló belső huzalozását miközben hozzápatkolok egy oldalkocsit.
Az alkalmazás kifejezetten sokat látott már és bonyolult, Microsoft technológiák és irányzatok állatkertje, a világon keresztülmigrált fejlesztéssel. Az alkalmazott technológiák többségéhez nem értek. Az alkalmazás számomra lényegi része .Net 4.7.2-n van jelenleg.
Az alkalmazás által nyilvántartott entitások adatmezőinek egy része csatlakoztatott MS-AD-ból származik, másik része pedig az alkalmazás saját SQL-szerveréből, amely kiegészíti az AD-ban tárolt adatmezőket (az AD-s sémát kiegészíti az SQL-ben tárolt séma). A kettőnek mindig együtt van értelmeKifejezetten nem cél és nem kívánatos, hogy a fejlesztendő REST szerviz közvetlenül a jelenlegi, alkalmazáslogikát megkerülve, hozzáférjen az adattárhoz (AD + SQL szerver) és onnan próbáljon meg adatokat visszaadni vagy oda írni.
A meglévő legacy interfész (amit ki akarnak váltani) használata, illetve hogy annak a funkcionalitását egy REST interfész mögé rejtsem nem kívánatos, hiszen így bebetonoznám a legacy interfészt (továbbra is karban kéne tartani).
Ha eltekintünk ettől a legacy interfésztől, akkor én úgy gondolom (nincs megerősítve, de erős a gyanúm), hogy nincsen az alkalmazásban másik interfész amihez a REST-szervízt külön processzként futtatva hálózaton (vagy localhoston) keresztül tudnék csatlakozni a Rest-szervíz leendő belső interfészével és onnan le tudnám kérdezni az adattárat. Tehát úgy gondolom, hogy mindenképpen hozzá kell nyúlnom az alkalmazáshoz és az alkalmazással azonos processzen belül -de külön threaden- kell fusson a REST-szervíz.
A leendő architektúrára a jelenlegi legjobb működőképesnek gondolt ötlet a következő:
Az alkalmazás két példányban fog futni:
-(1) Az első példány a jelenlegi REST nélküli verzió lesz aminek a legacy interfészére csatlakoznak a legacy kliensek. Ehhez nekem nem lenne közöm.
(2)A második példány az applikáció REST-szervizzel kiegészített változata lenne, ehhez a változathoz nem fognak csatlakozni legacy kliensek és a legacy interfésze nem lesz aktív használatban. Ez a második példány ugyanahhoz az AD-hez és ugyanahhoz a logikai SQL szerverhez fog csatlakozni mint az első példány.Egymással párhuzamosan írják/olvassák az adatbázisokat.
Ez már jelenleg is működik és nálam hozzáértőbb emberek úgy gondolják, hogy nem fognak összeakadni az egyes alkalmazáspéldányok (már ma is van HA konfiguráció közös replikált SQL adatbázissal és közös AD-vel).Ezt a második, REST-tel kiegészített példányt kellene most összehozni.
Az ötletem az, hogy a REST API egy ASP .NET Core 3.1 projekt lenne amelyhez tartozó ASP WebHost objektumot az applikációból (annak a belépési pontját megkeresve) egy külön Thread-en indítanám el, az pedig a megadott porton fogadná a kéréseket.
A REST-szervíz belső fele pedig az appnak azokat a (megtalálandó) .NET -es objektumait használná mint kliens ahová jelenleg a legacy interfész is csatlakozik. Hogy ez mennyire jól behatárolható azt még nem tudom. Gondolom ezekhez az objektumokhoz írni kéne majd valami wrappert ami ezeket mint ASP-kontrollerbe injektálható szervízt fogja átadni.
Valami észrevétel?
Előre is köszi!
J. -
Tigerclaw
nagyúr
Ismerkednék az ASP.NET Core razor pages-el és VS 2019 for mac alatt indítottam egy ilyen új projektet. Futtani szeretném, de egy ilyen üzenet ugrik fel:
Invalid development certificate found:
A valid HTTPS certificate was found but it may not be accessible across security partitions. To fix this, we need to run "dotnet dev-certs https" to ensure it will be accessible during development. This will ask for your password to access the Keychain. Do you agree to running this tool?
Nem találkoztam még olyan alkalmazással, ami a keychainhez kért volna hozzáférést. Enélkül nem tudok tovább lépni. Ezt el kell fogadnom, ez a hivatalos menete ennek?
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- 16GB-os SODIMM (notebook) DDR4 RAM bazár - nézz be, lesz, ami kell neked!
- HP 15-af105nh laptop (15,6FHD/AmdQuad/4GB/128SSD/Magyar) - Akku X
- JOYOR S5 Pro 10" Elektromos Roller 26Ah Akkumulátorral Moddolt!
- XPS 13 9310 13.4" FHD+ IPS i7-1185G7 16GB 512GB NVMe ujjlolv IR kam gar
- Megkimélt Apple iPhone 8 Plus 64GB Fekete szinben, 100% akkuval, kártyafüggetlen, garanciával
- BESZÁMÍTÁS! Microsoft XBOX Series S 512GB játékkonzol garanciával hibátlan működéssel
- Lenovo Legion Pro 5 16IRX9
- BESZÁMÍTÁS! ASUS Z97-A Z97 chipset alaplap garanciával hibátlan működéssel
- ÁRGARANCIA! Épített KomPhone i5 12400F 16/32/64GB RAM RTX 3060 12GB GAMER PC termékbeszámítással
- Bomba ár! HP ZBook Studio G5 - i9-9980H I 32GB I 1TSSD I Nvidia I 15,6" FHD I Cam I W11 I Gar
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest