25 Dec 2011

NuSOAP v PHP a sežrání SOAPu C# aplikací

(Mimochodem, jak byste v tomto kontextu přeložili "consuming" vy?)

Tak se stalo, že po půl roce zase něco napíšu a opět to bude něco spíše pro vlastní zapamatování, ale snad z toho někdy bude těžit i někdo jiný.

Pracuji na jednom projektu sestávajícího z webu v PHP napojeného na MySQL databázi a klientské aplikace v C# (aplikaci by bylo možné udělat i online, ale protože se v PHP vyznám tak z poloviny dobře jako v C# (a ASP.NET/Silverlight nepřipadá tady v úvahu), tak jsem se rozhodl polovinu ušetřeného času raději věnovat řešení problémům s propojením MySQL se C# přes SOAP:)) )

A že těch problémů bylo (a asi ještě bude). Pro generování WSDL souboru jsem se rozhodl použít PHP knihovnu NuSOAP, což proběhlo ještě relativně v pohodě a dokonce to fungovalo. (Maličké how-to např. zde: http://www.scottnichol.com/nusoapprogwsdl.htm, další pak na Googlu).

Trocha legrace začala při pokusech o vytvoření reference na službu ve Visual Studiu 2010, díky této stránce jsem se dozvěděl, že to nejde přes "Service reference", ale musí se do projektu přidat zastaralá "Web reference".

V této fázi se mi dokonce podařilo vytáhnout ze C# pár dat z databáze přes mou službu, jakou jsem měl radost! O půl hodiny později se bohužel někde něco pokazilo a už mi nešlo vůbec nic (chyby typu "špatně formátované XML", nebo že je poškozená reference).

Po několika hodinách hledání, upravování a vyzkoušení několika dalších postupů (vyzkoušel jsem např. vestavěnou podporu SOAP v PHP5 a samostatný .wsdl soubor a pár dalších) jsem omylem kde hluboko v internetu našel sérii článků, která mě zachránila, díky!! (autor používá způsob, se kterým jsem do toho šel úplně nejdřív) - http://www.hirdweb.com/tag/nusoap/

Poté stačilo jen vyřešit problémy s kódováním (buďto se špatně zobrazovaly znaky v desktop aplikaci nebo se špatně uložily do databáze):

  • Na konci kódu SOAP serveru zavolat encode na odesílaná data: 

$server->service(utf8_encode($HTTP_RAW_POST_DATA));

  • Na řádku 5475 souboru nusoap.php bylo napevno nastavené kódování, asi to tvůrcům uniklo, takže jsem ho musel přepsat na UTF-8

function serialize($debug = 0)
 {
 $xml = '<?xml version="1.0" encoding="UTF-8"?>';
 

To je asi vše. Mám v plánu napsat rozsáhlejší, detailnější článek až vyřeším všechny problémy.

 

 

14 Mar 2010

Čtení XML pomocí třídy XDocument a ignorování vložených HTML tagů

Dnes jsem zapracoval na jednoduchém vylepšení své homepage - popisy, odkazy na obrázky, atd. jednotlivých projektů a jejich anglické a české verze jsou načítány z XML souboru. Během práce na této změně jsem opět narazil na jednu maličkou nepříjemnost, která souvisí s třídou XDocument - pokud mám nějaký text například uvnitř elementu "Text" a tento text obsahuje nějaké HTML značky, ať už je to a, b nebo div, tak se tyto značky nezobrazí/neaplikují.

Read the rest of this post »

12 May 2009

Vytváření vlastních sekcí ve web.configu

Častým způsobem ukládání nastavení webových aplikací v ASP.NET je ukládání do web.configu. V základu máme možnost přidávat jen elementy do sekce <appSettings>. Takový postup je OK, dokud nám stačí ukládat jen jednoduché věci ve tvaru klíč-hodnota. Kousek XML uchovávající například název stránky může vypadat následovně:

<appSettings>
    <add key="PageTitle" value="Moje stránka" />
</appSettings>

Read the rest of this post »

1 May 2009

Potvrzovací okénko v ASP.NET

Pokud potřebujete v ASP.NET potvrdit od uživatele nějakou akci, je jednou z možností vyvolání potvrzovacího okénka (jako je například ve WinForms/WPF MessageBox, ten ale v ASP.NET nenajdeme). Takový problém se dá elegantně vyřešit kouskem JavaScriptu. Pokud pro Button použijete kód, který uvidíte níže, vyskočí na uživatele při kliknutí potvrzovací okénku a handler eventu OnClick se zavolá jen tehdy, pokud uživatel klikne na Ano/OK – nemusíte se tedy starat o žádné podmínky co udělat, když uživatel dá Ne, a tak dále.

Teď tedy slíbený kód:

<asp:Button ID="DeleteBtn" OnClick="DeleteBtn_Click" OnClientClick="return confirm('Jste si jistý, že chcete položku smazat?');" Text="Delete" Width="100" Height="40" runat="server" />

14 Apr 2009

Numeric-only TextBox v ASP.NET bez JavaScriptu

Asi profláklá věc, ale nevadí.

Tak tedy - máte TextBox a chcete co nejjednodušeji zajistit, aby do něj uživatel mohl napsat jen čísla? Mým oblíbeným způsobem je použití validátoru CompareValidator, který dokáže porovnat obsah zadaného TextBoxu proti nějakému datovému typu. Pokud chcete celá čísla, porovnáte obsah s Integerem atd.:

</span><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="Jen čísla" Operator="DataTypeCheck" Type="Integer"></asp:CompareValidator>

1 Mar 2009

Vyplnění stringu určitým počtem znaků

Možná jste někdy potřebovali vyplnit nějaký TextBox určitým počtem znaků, který zadal uživatel, nebo se může nějak dynamicky (situaci si kdy k tomu může dojít nechám vaší fantazii, tohle je jen příklad, jak to vyřešit v .NET). Jak byste to vyřešili v “normálním” jazyku? Desetkrát projít for cyklem a v každé iteraci přidat hvězdičku, pokud uživatel řekne, že chce deset hvězdiček? Ano, takhle by se to dalo udělat ve většině jazycích, ale jazyky z .NET můžou využít konstruktor třídy String, který přijímá parametr typu string a číslo udávající, kolikrát se má zadaný string vypsat. Pokud tedy chcete naplnit TextBox deseti hvězdičkami, docílíte toho takto:

tb1.Text = new String('*', 10);

10 Jan 2009

Sledování práce se soubory pomocí FileSystemWatcher [C#]

Dneska jsem potkal zajímavou třídu v .NET frameworku, která umožňuje sledovat, co se děje v soubory v zadané složce. Třída se nachází v namespacu Sytem.IO, její velmi důležitou součástí je enumerace NotifyFilters:

<span class="kwrd">public</span> <span class="kwrd">enum</span> <span class="type">NotifyFilters</span> { Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size }

Příklad si ukážeme na adresáři MojeSložka v rootu, která má v sobě několik .txt souborů.

Read the rest of this post »

23 Dec 2008

Vlákna v PDF

Slíbil jsem to a svůj slib plním. Těsně před Vánoci uvolňuji celý seriálech o vláknech v C# ve formátu PDF. Stahujte, tiskněte, dělejte si, co chcete :-)

19 Oct 2008

Vlákna v C# - 7. díl

Existují tzv. modely apartmentů (oddělení), úzce spjaté s COM (velmi zjednodušeně řečeno je to předchůdce .NET frameworku). Od takovýchto modelů se sice .NET snaží odprostit, ale někdy je můžete potřebovat, hlavně při práci se staršími API (mezi něž se tedy COM řadí). Ve skutečnosti najdou využití častěji, než se může na první pohled zdát. Vždyť WinForms používají z velké části obalené Win32 API! Celý článek na Programujte.com

3 Oct 2008

A zase další vlákna a nový Blend

Vyšel 6. díl vláken v C#: Synchronizační kontext může přesáhnout rámec jednoho objektu (instance třídy). Pokud byl synchronizovaný objekt vytvořen z jiné třídy, obě třídy pak sdílejí stejný kontext (jeden velký zámek). Toto chování se dá upravit pomocí nastavení atributu Synchronization přes třídu SynchronizationAttribute... Celý článek na Programujte.com

A za pár hodin vyjde první díl dvoudílného mikroseriálu o upravení šablony tlačítko pomocí Expression Blend: Tím, že děláme šablonu, ve skutečnosti děláme nový resource soubor, který můžeme aplikovat na ostatní tlačítka. Položka Name je jasná, tam zadáme název resource souboru. Zajímavější část je „Define in“, máme na výběr „Application“ (resource bude dostupná v celé aplikaci, ve všech jejích souborech), „This document“ (bude dostupná jen ve vybraných částech programu) a nakonec máme možnost vytvořit i nový „Resource dictionary“ – tím by se nám šablona vytvořila v samostatném souboru, který pak můžeme šířit mezi ostatní lidi. Vyberte si, co vás momentálně zajímá, pro naše účely bude bohatě stačit volba „This document – Window: Window“. Celý článek na Programujte.com

Twitter