Ir reizes, kad jāpārkāpj sava komforta zona un jāintegrējas ar kaut ko pavismaz *nefamilāru* :) Ir jau nācies darboties ar citu firmu izstrādājumiem, bet tomēr pēdējā laikā ir pārsvarā MS produkti lietošanā tikai.
Tā nu lūk vienā no projektiem nācās sarunāties ar Apache serveri. Drāts otrā galā atradās RESTful serviss, kas nodrošināja zināmu funkcionalitāti, kuru nepieciešams bija izsaukt no .NET platformas.
Pirmajā acu uzmetienā izskatās uzdevums pavisam vienkāršs: izveidojam WebRequest klases instanci, saliekam visus nepieciešamos parametrus un iegūstām atbildes plūsmu. Uzdevums pavisam vienkāršs.
Pirmā mēģinājumā izveidojam visu nepieciešamo support koda bāzi, saliekam nepieciešamās īpašības WebRequest klasei un mēģinām iegūt atbildes plūsmu.
string requestContent =
string.Format("<xml/>", "arg1", "arg2");
var request = WebRequest.Create("http://server/service.xml");
request.Method = "post";
request.Credentials = new NetworkCredential { UserName = "user", Password = "password" };
byte[] byteContent = Encoding.ASCII.GetBytes(requestContent);
request.ContentLength = byteContent.Length;
Stream stream = request.GetRequestStream();
stream.Write(byteContent, 0, byteContent.Length);
stream.Close();
request.GetResponse();
Pēc pieprasījuma izpildes, serveris atgriež sekojošu kļūdu: "(501). Not Implemented.", kas no HTTP standarta nozīmē, ka serveri ir uzprasīts kaut kas tāds, ko šis nav ar mieru darīt.
Tālāk sekoja vairākas stundas dažādos .NET platformas tumšajos koda bibliotēku nostūros, kas tieši vai netieši atbild par dažāda veida komunikācijas veidiem pa drāti. Beigās pat tika izmēģināts WCF RESTful pašrakstīts klients, kas nemaz nebija tik īss, kodolīgs un vienkāršs, kā apgalvoja raksta autors :)
Pa vidu pat tika noimplementēts PHP proxy serviss, kas darbojās līdzīgi kā “man in the middle”, pārķerot visus pieprasījumus no .NET platformas un izpildot tos pret gala serveri un atbildi vienkārši forwardējot atpakaļ .NET klientam. Šis risinājums vismaz strādāja, bet tomēr nebiju ar mieru, ka savā zoodārzā ir jāuztur vēl viens dzīvnieciņš. Jautājums bija gluži kā Madagaskaras pingvīniem: “Nu kur jūs esat redzējuši pingvīnus Ņujorkā??”
Nācās tomēr pētīt tālāk šo problēmu.. Ieejot lieliskajā VS atkļūdošanas un skaņošanas režīmā papētot catch() zaru secinājums ir, ka serveris atgriež sekojošu kļūdu:
"Method <xml/>POST is not defined in RFC 2068 and is not supported by the Servlet API"
Parokoties nedaudz pa interneta plašumiem beidzot uzdūros šīs problēmas risinājumam, kas saistīts ar to, ka Apache serverim ir zināmas problēmas dažreiz atbildēt ar pareizo HTTP statusa atbildi. Klients savu pieprasījumu veido ar “Expect: 100-continue” galvenes ierakstu. Ideja šim ierakstam ir, ja serveris būs gatavs apstrādāt šo pieprasījumu, serverim būtu jāatbild ar “100 Continue” atbildi. Ja turpmākie pieprasījumi tiktu atteikti, tad serverim būtu jāatbild ar izbeigšanas atbildi un attiecīgo statusu (rfc 2616).
Beigu beigās viss beidzas labi un šai problēmai ir risinājums:
string requestContent =
string.Format("<xml/>", "arg1", "arg2");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(http://server/service.xml);
..
request.ServicePoint.Expect100Continue = false;
..
request.GetResponse();
Viss ir labi, kas labi beidzas.
Cerams, ka noderēs!