BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

.gitignore skirtas .NET

Parašė Sergejus | 2012-01-17 00:30

Kadangi DotNetGroup 3.0 platformos kūrimui naudojama Git versijavimo sistema, nusprendžiau pasidalinti savo .gitignore failu, skirtu .NET projektams. Failą patalpinau GitHub Gist, tad siūlykite savo papildymus!

#ignore thumbnails created by windows
Thumbs.db
#ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.lib
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
[Tt]est[Rr]esult*
*.dotCover
*.ReSharper
packages

Rodyk draugams

Savaitės video - When strange things happen in .Net programs

Parašė Sergejus | 2011-12-23 00:20

Šį kartą jūsų dėmesiui siūlau labai įdomų Romualdo Stonkaus pristatymą When strange things happen in .Net programs.

Rodyk draugams

Patogi ir funkcionali Windows konsolės atmaina

Parašė Sergejus | 2011-11-10 21:31

Prieš kelias savaites TechDay Lithuania konferencijoje dariau pristatymą iš ASP.NET optimizavimo ir dalis demonstracijų vyko tiesiai komandinėje eilutėje. Kai kurie dalyviai pastebėjo, kad aš nesinaudojau standartine konsole, o kažkuo panašiu į tai:

image

Tai yra ypatingai patogi bei funkcionali standartinės Windows konsolės atmaina - Console2. Console2 sukonfigūravau taip:

  • Ctrl-T – nauja konsolės kortelė
  • Ctrl-P – nauja PowerShell kortelė
  • Ctrl-W – kortelės uždarymas
  • Ctrl-V – teksto įterpimas
  • Teksto pažymėjimas ir kopijavimas su Shift + pele
  • Integracija su Visual Studio Command Prompt
  • Permatomas fonas

Konfigūracijos failą galite parsisiųsti ir pasidėti šalia Console.exe.

Rodyk draugams

Nuosava diegimo repozitorija Web Platform Installer pagrindu

Parašė Sergejus | 2011-04-26 14:56

Paskutiniu metu su kolegomis vystome idėją, kaip sukurti mūsų sistemos centrinę diegimo repozitoriją. Kadangi sistema yra kompleksinė ir sudaryta iš daugelio modulių, aplikacijų ir trečių šalių programinės įrangos (IIS, SQL Server ir panašiai), sistemos diegimas į naujus serverius nėra trivialus uždavinys su daug priklausomybių ir griežtai apibrėžta diegimo tvarka. Mums norėtųsi visą serverio diegimo procesą suvesti iki kelių mygtukų paspaudimo.

Kadangi dviračio išradinėti nesinorėjo, pradėjome analizuoti kokius egzistuojančius sprendimus mes galime pernaudoti. Iš karto krito į akis Microsoft Web Platform Installer 3.0.

image

Web Platform Installer, arba sutrumpintai WebPI, atlieka labai panašią užduotį: leidžia instaliuoti produktus ir aplikacijas, sužiūri visas priklausomybes ir automatiškai parsiunčia trūkstamus komponentus. Atrodo patraukliai, bet kaip WebPI praplėsti pagal mūsų poreikius? Pasirodo, WebPI produktų metaduomenų aprašymui naudoja Atom ir turi galimybę praplėsti produktų sąrašą nurodant nuosavus Atom failus. Dar daugiau, visą tai galima daryti ne tik iš grafinės sąsajos, bet ir iš komandinės eilutės, tereikia parsisiųsti WebPI Command Line.

Įsitikinę, kad WebPI vertas tolimesnio nagrinėjimo, perėjome prie jo funkcionalumo ir galybių analizės. Geriausias būdas išmokti kaip veikia ir ką gali WebPI – išanalizuoti esamus Atom failus kataloge %localappdata%\Microsoft\Web Platform Installer. Taip pat labai padėjo WebPI schemos aprašas. Žemiau pateiksiu tokio Atom failo pavyzdį:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <webpiFile version="3.0.0.0" />

  <title>Tools Platform Installer 3.0 Feed</title>
  <link href="http://www.microsoft.com/web/webpi/3.0/ToolsProductList.xml" />
  <updated>2009-3-17T16:30:00Z</updated>
  <author>
    <name>Microsoft</name>
    <uri>http://www.microsoft.com/</uri>
  </author>
  <id>http://www.microsoft.com/web/webpi/3.0/ToolsProductList.xml</id>

  <!-- Resources -->
  <resourcesList>
    <resources>
      <culture>en</culture>
      <!-- included in file -->
    </resources>
    <resources>
      <culture>de</culture>
      <url>http://www.microsoft.com/web/webpi/3.0/resources/ToolsProductList_de.xml</url>
    </resources>
  </resourcesList>

  <!--Language Codes-->
  <languages>
    <language default="true">
      <languageId>en</languageId>
      <name resourceName="Lang_en_Name">English</name>
    </language>
  </languages>

  <!-- Windows Azure SDK -->
  <entry>
    <productId>WindowsAzureSDK</productId>
    <title resourceName="Entry_WindowsAzureSDK_Title">Windows Azure SDK</title>
    <version>1.4</version>
    <summary resourceName="Entry_WindowsAzureSDK_Summary">
	The Windows Azure SDK Version 1.4 provides developers with tools and APIs for building
    scalable services for deployment to Windows Azure.
	</summary>
    <longSummary resourceName="Entry_WindowsAzureSDK_LongSummary">
	The Windows Azure Platform is an Internet-scale cloud services platform hosted through
    Microsoft data centers. The platform includes the Windows Azure operating system and a
    set of rich developer services.
	</longSummary>
    <link href="http://msdn.microsoft.com/en-us/library/dd179367.aspx" />
    <author>
      <name>Microsoft Corporation</name>
      <uri>http://www.microsoft.com/</uri>
    </author>
    <images>
      <icon>http://www.microsoft.com/web/media/gallery/apps-screenshots/wa_vs_graphic.png</icon>
    </images>
    <published>2011-04-11T12:00:00Z</published>
    <discoveryHint>
      <or>
       <discoveryHint>
        <registry>
          <keyPath>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting\v1.0</keyPath>
          <valueName>FullVersion</valueName>
          <valueValue>1.4.20227.1419</valueValue>
        </registry>
       </discoveryHint>
       <discoveryHint>
        <registry>
          <keyPath>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting\v1.0</keyPath>
          <valueName>FullVersion</valueName>
          <valueValue>1.4.20407.2049</valueValue>
        </registry>
       </discoveryHint>
      </or>
    </discoveryHint>
    <dependency>
      <and>
        <dependency>
          <productId>ASPNET</productId>
        </dependency>
        <dependency>
          <productId>CGI</productId>
        </dependency>
        <dependency>
          <productId>NETFramework35</productId>
        </dependency>
        <dependency>
          <productId>PowerShell</productId>
        </dependency>
        <dependency>
          <productId>IISManagementConsole</productId>
        </dependency>
      </and>
    </dependency>
    <updates>
      <productId>AzureSDKRefresh_14</productId>
    </updates>
    <installers>
      <installer>
        <id>1</id>
        <languageId>en</languageId>
        <architectures>
          <x86 />
        </architectures>
        <osList>
          <os>
            <minimumVersion>
              <osMajorVersion>6</osMajorVersion>
              <osMinorVersion>0</osMinorVersion>
              <spMajorVersion>0</spMajorVersion>
            </minimumVersion>
            <osTypes>
              <Server />
              <Ultimate />
              <Enterprise />
              <Business />
              <HomePremium />
            </osTypes>
          </os>
        </osList>
        <eulaURL>http://www.microsoft.com/web/webpi/eula/EulaWindowsAzureSDKFINAL.htm</eulaURL>
        <installerFile>
          <!-- size of the package in KBs -->
          <fileSize>9349</fileSize>
          <installerURL>http://download.microsoft.com/download/3/3/2/3321A9FA-64C3-463F-981A-4E17FC29B15B/WindowsAzureSDK-x86.exe</installerURL>
          <displayURL>http://msdn.microsoft.com/en-us/library/dd179367.aspx</displayURL>
        </installerFile>
        <helpLink>http://msdn.microsoft.com/en-us/library/dd179367.aspx</helpLink>
        <installCommands>
          <cmdline>
            <exe>%InstallerFile%</exe>
            <commandLineArguments>/quiet /norestart</commandLineArguments>
          </cmdline>
        </installCommands>
      </installer>
      <installer>
        <id>2</id>
        <languageId>en</languageId>
        <architectures>
          <x64 />
        </architectures>
        <osList>
          <os>
            <minimumVersion>
              <osMajorVersion>6</osMajorVersion>
              <osMinorVersion>0</osMinorVersion>
              <spMajorVersion>0</spMajorVersion>
            </minimumVersion>
            <osTypes>
              <Server />
              <Ultimate />
              <Enterprise />
              <Business />
              <HomePremium />
            </osTypes>
          </os>
        </osList>
        <installerFile>
          <!-- size of the package in KBs -->
          <fileSize>9264</fileSize>
          <installerURL>http://download.microsoft.com/download/3/3/2/3321A9FA-64C3-463F-981A-4E17FC29B15B/WindowsAzureSDK-x64.exe</installerURL>
          <displayURL>http://msdn.microsoft.com/en-us/library/dd179367.aspx</displayURL>
        </installerFile>
        <helpLink>http://msdn.microsoft.com/en-us/library/dd179367.aspx</helpLink>
        <installCommands>
          <cmdline>
            <exe>%InstallerFile%</exe>
            <commandLineArguments>/quiet /norestart</commandLineArguments>
          </cmdline>
        </installCommands>
      </installer>
    </installers>
  </entry>
</feed>

Kaip matyti, failo struktūra yra aiški ir nereikalaujanti išsamaus paaiškinimo. Norėtųsi aptarti tik keletą elementų:

  • productId – unikalus produkto ID, kuris bus naudojamas tiek norint instaliuoti produktą, tiek jį įtraukiant kaip priklausomybę ar atnaujinimą;
  • discoveryHint – naudojamas tikrinant ar produktas jau yra suinstaliuotas, nusakant registry, file ar msiProductCode;
  • dependency – nurodo nuo kokių kitų produktų priklauso duotasis produktas; gali būti naudojami or/and operatoriai; visos priklausomybės bus sudiegtos (jeigu dar nėra) prieš diegiant duotąjį produktą;
  • updates – nurodo kokius atnaujinimus reikia sudiegti duotajam produktui; gali būti naudojami or/and operatoriai; visi atnaujinimai bus sudiegti sudiegus duotąjį produktą;
  • installers – išvardinami visi įmanomi diegėjai, nurodant kokia architektūra ir operacijų sistema yra palaikomos; jeigu diegėjas yra universalus – viską galima sutraukti į vieną įrašą;
  • installCommands – naudojamas elemento installers viduje ir nusako kaip bus vykdomas produkto diegimas; galimos reikšmės: cmdline, msiInstall ar msuInstall; praktikoje mums užteko cmdline.

Žinodami kaip atrodo ir iš ko susideda WebPI Atom failas, nesunkiai pasirašėme savo. Dabar tik reikėjo prijungti nuosavą Atom failą prie WebPI ir WebPI Command Line. Pirmu atveju, tai daroma iš nustatymų:

image

image

Antru atveju, tiesiogiai komandinėje eilutėje:

WebpiCmdLine.exe /AcceptEula /XML:http://localhost/products.xml /Products:MyProduct

Aukščiau pateikta komanda sudiegs MyProduct ir visas meta duomenyse nurodytas priklausomybes bei atnaujinimus. Paprasta ir efektyvu!

Jeigu susidomėjote, dar keletas naudingų nuorodų:

Rodyk draugams

IIS7 klaida "HTTP Error 500.19 - Internal Server Error"

Parašė Sergejus | 2010-12-29 21:56

Darbe kolegos susidūrė su įdomia IIS 7 problema, kuri pasireiškė tam tikruose Windows Server 2008 serveriuose. Sudiegus ASP.NET MVC 2 aplikaciją ir bandant ją pakrauti – įvykdavo IIS klaida „HTTP Error 500.19 - Internal Server Error“.

Module: IIS Web Core

Notification: BeginRequest

Handler: Not yet determined

Error Code: 0×80070021

Config Error This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".

Sprendimas (net keli) pasirodo yra paprastas, bet pakankamai sunkiai surandamas. Klaidos priežastis – nauja IIS 7 galimybė Feature Delegation, kuri leidžia uždrausti keisti tam tikrus IIS nustatymus, kaip, pavyzdžiui, pridėti naujus modulius (angl. modules). Šiuo atveju, reikėjo leisti keisti modules ir handlers nustatymus iš aplikacijos Web.config failo.

Sprendimo būdas #1 (iš IIS Manager)

IIS Manager lange pasirinkite Feature Delegation punktą:

image

Suraskite punktą Modules ir iš kontekstinio meniu pasirinkite Read/Write:

image

Pakartokite tą pati su Handlers.

Sprendimo būdas #2 (iš komandinės eilutės)

Įvykdykite žemiau pateiktas komandas iš komandinės eilutės (administratoriaus teisėmis):

%windir%\system32\inetsrv\appcmd.exe unlock config /section:system.webServer/handlers

%windir%\system32\inetsrv\appcmd.exe unlock config /section:system.webServer/modules

Sprendimo būdas #3 (iš konfigūracijos failo)

Atidarykite globalų IIS konfigūracijos failą %windir%\system32\inetsrv\config\applicationHost.config. Jame suraskite sekciją modules:

<section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />

Pakeiskite į overrideModeDefault="Allow".

Pakartokite tą pati su handlers ir išsaugokite pakeitimus.

 

Tikiuosi šis straipsnis ateityje išsaugos jums laiką ieškant šios problemos sprendimo būdų.

Rodyk draugams

FTP over SSL konfigūravimas IIS 7 ir jo panaudojimas iš C#

Parašė Sergejus | 2010-12-27 21:24

FTP yra vienas iš seniausių failų mainų protokolų, kuriam Microsoft, mano manymu, skyrė neypatingą dėmesį. Apart tradicinio, nesaugaus FTP protokolo, egzistuoja dvi jo variacijos: FTP over SSH, dar žinomas kaip Secured FTP arba SFTP bei FTP over SSL, dar žinomas kaip FTPS. Iki šiol nei viena, nei kita saugaus FTP atmaina nebuvo oficialiai palaikoma IIS, todėl tekdavo naudoti trečios šalies FTP serverius. Laimei, atsirado galimybė parsisiųsti FTP Publishing Service, skirtą IIS 7 ir naujesnėms versijoms.

Konfigūravimas

Suinstaliavus FTP Publishing Service, IIS Manager atsiras nauji su FTP susiję punktai:

image

Prieš pradedant konfigūruoti FTP over SSL, pirma reikia sugeneruoti SSL sertifikatą, tai galima padaryti paspaudus ant Server Certificates ir pasirinkus punktą Create Self-Signed Certificate:

image

Norėdami pridėti naują FTPS saitą, užtenka paspausti dešiniu pelės mygtuku ant katalogo Sites ir pasirinkti Add Ftp Site. Atsiradusiame lange įvedame FTP pavadinimą bei fizinį adresą. Kitame vedlio žingsnyje reikalaujame SSL panaudojimą bei nurodome prieš tai sugeneruotą sertifikatą:

image

Paskutiniame dialogo lange nurodome kas galės prieiti prie mūsų FTP, mano atveju, specialiai sukurtas vartotojas ftpuser:

image

Štai ir viskas, tai yra minimaliai reikalinga FTP over SSL konfigūracija skirta IIS 7.

FTPS panaudojimas

Žemiau pateiktas kodo pavyzdys, parodantys kaip prisijungti prie FTP over SSL:

static void Main(string[] args)
{
    ServicePointManager.ServerCertificateValidationCallback =
        (sender, certificate, chain, sllPolicyErrors) => true; 

    const string url = "ftp://localhost/";
    var ftp = (FtpWebRequest)WebRequest.Create(url);
    ftp.Credentials = new NetworkCredential("ftpuser", "ftp");
    ftp.UsePassive = true;
    ftp.EnableSsl = true;
    ftp.Method = WebRequestMethods.Ftp.ListDirectory;
    var response = (FtpWebResponse)ftp.GetResponse();

    using(var reader = new StreamReader(response.GetResponseStream()))
    {
        Console.WriteLine(reader.ReadToEnd());
    }

    Console.ReadKey();
}

Atkreipkite dėmesį į delegatą ServicePointManager.ServerCertificateValidationCallback. Kadangi aš naudoju taip vadinamą Self-Signed sertifikatą, įprastas FtpWebRequest išmestų su sertifikatu susijusią klaidą. Vienas iš apėjimo variantų – nurodyti sertifikato tikrinimo delegatą, kuris tiesiog visada grąžina true.

Tikiuosi šis straipsnis padės jums greičiau sukonfigūruoti bei pasinaudoti FTP over SSL.

Rodyk draugams

Web puslapių testavimas su WatiN

Parašė Sergejus | 2009-05-10 17:26

Kaip ir žadėjau, šį kartą parodysiu kaip galima supaprastinti Web puslapių automatinį testavimą naudojant WatiN biblioteką. Iš karto noriu pabrėžti, nors šiuo metu ir egzistuoja WatiN Test Recorder, kuris moka fiksuoti visus atliekamus veiksmus puslapyje ir pagal tai generuoti testavimo kodą, ilgesnei perspektyvai – nemanau kad tai yra geras sprendimas. Generuojamas kodas yra sunkiai palaikomas ir atnaujinamas. Būtent dėl šios priežasties, visus grafinės sąsajos testus aš rašau rankomis, o negeneruoju.


Jeigu atsimenate, Web puslapių automatinio testavimo karkasų palyginime aš pažymėjau, kad WatiN turi keletą trūkumų. Taigi pirma aprašysiu pagalbinę WebTestHelper klasę, kuri ir skirta minėtoms problemoms spręsti:



Pirmas metodas supaprastina paiešką elemento viduje (pavyzdžiui, DIV elemente), antras – apdoroja Microsoft AJAX kvietinius (tame tarpe ir UpdatePanel), o paskutinis – užtikriną saugų darbą su neprivalomais elementais.


Turint šiuos pagalbinius metodus – drąsiai galime pereiti prie bazinės klasės aprašymo:



Paaiškinsiu svarbiausias klasės vietas. ApplicationUrl savybė nuskaito testuojamos Web aplikacijos kelią (pavyzdžiui, http://server/WatiNDemo). CreateBrowser metodas naudojamas kaip fasadas reikalingos naršyklės sukūrimui. Jeigu reikės vykdyti testus ne tik su Internet Explorer, bet ir su FireFox ar Chrome – užteks logiką pakeisti tik šioje vietoje. WatiN turi pakankamai lankstų API, kas leidžia Initialize() metode paieškai pagal ID nurodyti nuosavą algoritmą klasės FindByAspIdFactory dėka. Kaip ir seka iš pavadinimo, ji specialiai skirta ASP.NET ir atrodo taip:



Štai mes ir turime visus reikalingus griaučius ir galime tiesiogiai pereiti prie Web puslapio testavimo. Tam naudosime tokį paprastą ASPX:



Puslapyje atvaizduojamas įvedimo laukelis, išskleidžiamas sąrašas bei mygtukas Prisijungti, paspaudus kurį, rodomas pranešimas „Prisijungęs“. Šio puslapio testas, tikrinantis Login funkcionalumą, galėtų atrodyti taip:



Pirmas dalykas ką aš darau rašant UI testus – apgaubiu UI elementus į atitinkamo tipo savybes. Tai leidžia atskirti testavimo logiką nuo grafinių elementų paieškos (kas dažnai irgi reikalauja nemažai kodo). Rezultate, mes turime labai paprastą, lengvai skaitomą ir palaikomą Web puslapio testą!


Tikiuosi šis straipsnis padės jums naujai pasižiūrėti į UI testavimą. O kaip jus darote UI testavimą? Manau, daugeliui būtų įdomu sužinoti!

Rodyk draugams

WatiN testų vykdymas Team Foundation Server

Parašė Sergejus | 2009-05-07 22:21

Praeitame straipsnyje aprašiau tris populiariausius .NET Web puslapių automatinio testavimo karkasus. Priminsiu, kad man patogiausiu bei labiausiai atitinkančiu mano poreikius pasirodė WatiN. Vienas iš tikslų, kurių norėjau pasiekti – įtraukti Web puslapių grafinės sąsajos testus į naktinį surinkimo procesą (nightly buils) TFS serveryje. Po to, kai aš praleidau kelias valandas bandydamas tai padaryti, nusprendžiau parašyti šį straipsnį –