Witam
Dostałem zadanie do zrobienia i nie wiem jak się za to zabrać. Muszę zrobić Web Api- to bez problemu. Ale musi być tak, że rekord dodaje się do bazy po wpisaniu w adresie przeglądarki i zatwierdzeniu enterem. Ma wysyłać się metodą post. Jak do tego podejść? Szukałem na różnych stronach i nie znalazłem. Dodam tylko, że ma się także dodawać np taki ciąg: " KA:12k/fd1\asA ". Jak to rozwiązać?
Ale jakie jest konkretnie pytanie?
Na początku wykorzystaj istniejący, defaultowy kontroler, zapoznaj się z atrybutami [HttpGet] i [HttpPost], z konwencjami dotyczącymi routingu, poczytaj o różnicach między [FromBody], a [FromUrl], odwołaj się z akcji do DbContextu i dodaj rekord.
konkretnie to muszę dodać do bazy ciąg: "#tg/34:54\HA" jako całość. Muszę to zrobić wpisując w adres przeglądarki: api/controller/tenCiag i nie wiem jak do tego podejść, na razie mi nie działa.
Doszedłem do pewnych wniosków. Web api mi działa. Dodaje do bazy to co chce, nie działa mi tylko gdy dodam np: sdd/sdfs/a Jak to można rozwiązać? Kombinuję w ten sposób:
[Route("api/productsAdd/{name}")]
ale mi nie działa
Masz tutaj artykuł jak obsłużyć specjalne znaki w URL:
http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx
Próbowałem i niestety nie działa mi ta konfiguracją. Cały czas mam błędy. W którą stronę kombinować? Myślałem żeby zmieniać w web configu- nie działa. Na różne sposoby próbowałem. Są jakieś sposoby może na dodanie czegoś do WebApiConfigu lub RouteConfigu? Bo już nie mam pojęcia. Dwa dni od rana do wieczora siedzę i nie działa :(
Ale wiesz, że Twój problem wynika z tego, że próbujesz zrobić coś bez sensu, co jest jakby niezgodne z HTTP i w ogóle tak się nie robi?
Wiem, że mój problem jest niezgodny ale muszę to zrobić na zajęcia. Wykładowca tak sobie wymyślił żebym się pomęczył a potem mam mu odpowiedzieć czy to jest dobre rozwiązanie i dlaczego tak uważam. Nie mój wymysł ;\ W kodzie mam zwykły kontroler i modyfikację w web.config
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2"
requestPathInvalidCharacters="" /> <!-- dodanie w celu dodawania ciągów typu: tg/df22/cdf:534 -->
<pages validateRequest="false" /> <!-- dodanie w celu dodawania ciągów typu: tg/df22/cdf:534 -->
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
</system.web>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true"> <!-- dodanie w celu dodawania ciągów typu: tg/df22/cdf:534 -->
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
</modules >
</system.webServer>
Kod kontrolera api- część odpowiedzialna za dodawanie:
public class ProductsController : ApiController
{
private ApiContext db = new ApiContext();
[Route("api/productsAdd/{*name}")]
[ResponseType(typeof(Products))]
[AcceptVerbs("GET", "POST")]
[HttpPost]
public bool Add(string name)
{
Products products = new Products();
products.Text = name;
products.Date=DateTime.Now;
products.Name = "text";
products.LastName = "fsgs";
db.Products.Add(products);
db.SaveChanges();
return true;
}
// #TG/29:78\HC
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool ProductsExists(int id)
{
return db.Products.Count(e => e.Id == id) > 0;
}
}
Zamieściłem wyżej mój kod api i configu. Jak mogę podejść do problemu? Dodam tylko że ta konfiguracja api działa w ten sposób że dodaje do bazy np: ka:/fd/aa ale nie zamienia dodając backslash na slash oraz pomija wszystko co jest za znakiem #, np #asd doda do bazy null a fds#aas doda do bazy fds
Pomija wszystko co jest za znakiem #, np #asd doda do bazy null a fds#aas doda do bazy fds
No to już masz jakąś poszlakę w kwestii "czy to dobry pomysł" żeby przekazywać tego typu dane GETem.
Tutaj masz definicję URLa: https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax
W ogóle. Wejdź pod ten adres który dałem. Zauważ, że od razu przewinęło Ci stronę do właściwego momentu, który Ci chciałem pokazać (tzn. na górze ekranu powinieneś mieć nagłówek "Syntax"). Teraz skasuj #Syntax z paska adresu i wejdź jeszcze raz. Tym razem strona załadowała się normalnie, a nie przewinięta w dół do sekcji "Syntax".
Jeżeli dopiszesz #costam
do adresu to przeglądarka interpretuje to w specjalny sposób (w uproszczeniu: "skocz do sekcji na stronie"), właśnie po to, żeby dało się podlinkować jakiś podpunkt w długim artykule etc. Te dane po znaku # nie są w ogóle wysyłane na serwer, toteż nie odbierzesz ich po stronie C#, bo ich tam po prostu nie ma.
No to teraz tak. Jak to obejść? Co jeżeli chcemy serio wysłać coś ze znakiem #
i nie chcemy żeby przeglądarka to interpretowała w specjalny sposób?
https://en.wikipedia.org/wiki/Percent-encoding
When a character from the reserved set (a "reserved character") has special meaning (a "reserved purpose") in a certain context, and a URI scheme says that it is necessary to use that character for some other purpose, then the character must be percent-encoded.
potwierdza to moje powyższe słowa na temat znaku #
;
na tej stronie możemy wyczytać w jaki sposób escape-ować/enkodować/wtf specjalne znaki między innymi dla URLi. I tutaj podpowiem: zamiast #
daj %23
w adresie. Przeglądarka będzie wiedziała że ma tego nie ruszać, a serwer powinien dostać już odkodowany, normalny znak #
.
O ile dobrze pamiętam dzięki temu percent-encodingowi można przemycić dowolny znak w URLu, który normalnie by nie przeszedł. Wnioski wyciągnij sam.
PS. No i jeszcze musisz coś zrobić w configu IISa jeżeli nie będzie Ci pozwalał tych znaków specjalnych wrzucić w URLa (tzn. zwróci Bad Request czy coś).
Dzięki za podpowiedź. Jak kod zakoduję i podam w przeglądarce to działa. A czy jest możliwość by za każdym razem kodować przesyłany tekst? C# sobie go odkoduje i doda do bazy czy nie ma takiej możliwości?
Generalnie siedząc dziś od rana nic nie wymyśliłem. Szukam rozwiązania w web.configu. W dobrym miejscu szukam problemu? generalnie muszę jeszcze tylko zrobić że jak wpiszę w adresie np: zasada%@# to przekonwertuje mi i wyśle do kontrolera ciąg: zasada%25%40%23 a ten już go obrobi i doda do bazy. Jak wpiszę samo: zasada%25%40%23 to działa-> dodaje do bazy a cały czas mam problem gdy wpisuję: zasada%@#. Albo jest null albo błędy albo dodaje częściowo. W internecie nic nie jest opisane. Poszę o pomoc. Chociaż o nakierunkowanie w którą stronę iść bo nie wiem ;\