Author Archives: Robert Haken

avatar Neznámé

About Robert Haken

Software Architect, Founder at HAVIT, Microsoft MVP - ASP.NET/IIS

Diff Visual Studio 11 z příkazové řádky + použití s TortoiseSVN

Krásný nový Diff-tool z Visual Studio 11 se dá vyvolávat i externě z příkazové řádky a dá se tak použít například i přímo z TortoiseSVN.

Obecná syntaxe je:

devenv /diff sourceFile targetFile [sourceDisplayName] [targetDisplayName]

Pokud již nějaká instance Visual Studia běží, použije se, jinak se spustí nové.

TortoiseSVN

Pro TortoiseSVN v Settings/Diff Viewer stačí přepnout na „External“ a použít:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe /diff %base %mine %bname %yname

(Cestu si samozřejmě upravte podle sebe.)

…teď už jenom zajistit, jestli se dá takhle vyvolat i merge. Z výpisu devenv /? to zatím nevypadá.

NuGet – poznámky z přednášky

Pár mých poznámek z přednášky o NuGet (Package Manager ve VS od Microsoftu), které zřejmě nebudu dále zpracovávat.

(Microsoft MVP Summit 2012 Seattle)

Links

Tvorba vlastního package

  • NuGet Command Line (ke stažení přes samotný NuGet)
  • VS / New Project / Class Library
    • NuGet.exe pack <.csproj file>
      • vznikne .nupkg
      • je to zip ála .docx
    • NuGet.exe push <.nupkg file>
  • [global: AssemblyInformationVersion(„any string“)]
    • pre-release = číslo verze obsahuje podtržítko

Nastavení vlastního NuGet feedu ve VS11

  • Tools / Library Package Manager / Package Manager Settings / Package Sources
  • dá se tam nastavit FilePath, kde mám své packages
  • nebo použít package „NuGet.Server“
    • Install-Package NuGet.Server
    • stáhne SLN s jednoduchým servříkem

C# 5: Caller Info Attributes

Zajímavá novinka v C# 5 poslouží například k logování. Následující příklad funguje ve Visual Studio 11 Beta

  class Program
    {
        static void Main(string[] args)
        {
            Log("Message");
        }

        static void Log(string message,
            [CallerMemberName] string callerMemberName = "",
            [CallerFilePath] string callerFilePath = "",
            [CallerLineNumber] int callerLineNumber = 0)
        {
            Console.WriteLine(message);
            Console.WriteLine(callerMemberName);
            Console.WriteLine(callerFilePath);
            Console.WriteLine(callerLineNumber);
        }
    }

Výstupem je např:

Message
Main
d:\Development\CallerAttributes\CallerAttributes\Program.cs
14

Juice UI – ASP.NET WebForms Controls pro jQuery UI

Na první dnešní přednášce ASP.NET 4.5 na Microsoft MVP Summitu byla prezentována zajímavá nová knihovna, která přináší jQuery UI Widgets do prostředí ASP.NET WebForms – Juice UI. Protože je to jedna z mála věcí, které nejsou pod NDA, mohu se s Vámi o tento poznatek podělit.

Juice UI aspiruje na náhradu AJAX Control Toolkitu a zahrnuje například tyto controly:

  • Accordition
  • Autocomplete
  • Button
  • DatePicker
  • Dialog
  • Draggable
  • Position
  • ProgressBar
  • Resizable
  • Slider
  • Sortable
  • Tabs

Použití je přímočaré a nijak nekomplikované, např.:

<Juice:Tabs ID="_Default" runat="server">
  <Juice:TabPage Title="Tab 1" ID="_Tab1">
    <TabContent>
      ...
    </TabContent>
  </Juice:TabPage>
  <Juice:TabPage Title="Tab 2" ID="_Tab2">
    <TabContent>
      ...
    </TabContent>
  </Juice:TabPage>
</Juice:Tabs>

…uvidíme, jak se vypořádají s porodními bolestmi, které AJAX ControlToolkit měl. Jedná se o open-source knihovnu použitelnou pod licencemi MIT nebo GPLv2.

Číslování stránek slovy v MS Word

  1. Vložte si do stránky klasické číslování (automatické pole)
  2. Pravým tlačítkem klikněte na číslo stránky a zvolte Toggle Field Codes
  3. Předpis pro automatické pole změňte ručně na
    • {PAGE \* CardText \* MERGEFORMAT} – pokud chcete číslo ve formátu „jedna“, „dva“
    • {PAGE \* OrdText \* MERGEFORMAT} – pokud chcete číslo ve formátu „první“, „druhý“, „třetí“ (bohužel nikoliv druhá)
    • …nejspíš se dají najít i další řídce dokumentované možnosti formátování
  4. Přepněte zpět pomocí Toggle Field Codes na výsledné zobrazení

Návrh schématu DB – Slides a záznam [MS Fest 2011]

Slides z přednášky pro MS Fest Praha 2011:

Záznam z přednášky najdete na našem YouTube Channel:

Task Scheduler – dvojí Stop task if it runs longer than…

Pozor na Task Scheduler, pokud mu nastavujete limit „Stop task if it runs longer than“. Ten limit je tam totiž dvakrát, a už jsem se několikrát napálil, že na jednom místě byl nastaven dostatečný a z druhého místa mi to task sestřelovalo a nedobíhal:

  1. Prvním místem je záložka „Settings“ v dialogu vlastností tasku.
  2. Druhým místem jsou Advanced Settings v editaci nastavení Triggeru tasku (Pro každý trigger jde nastavit limit jiný, což je sice hezké, ale…)

Validátory považují white-space za empty hodnotu

Leckoho možná překvapí chování validátorů (RegularExpressionValidatoru, CompareValidatoru a dalších) v jednoduchém případě:

<asp:TextBox ID="MyTB" runat="server" />
<asp:RegularExpressionValidator ValidationExpression="\d+" ControlToValidate="MyTB" Text="x" runat="server" />
<asp:Button Text="OK" runat="server" />

Co se děje:

  • hodnota „123“ validátor aktivuje, vstup je validní
  • hodnoty „123 “ nebo “ 123″ validátor aktivují, vstup není validní
  • hodnotu “ “ (white-space) validátor propustí, vstup je podle něj validní
    • nepomáhá ani ValidationExpression=“^\d+$“, validátor se prostě neaktivuje
  • hodnota „“ (String.Empty) validátor neaktivuje, validátory nevalidují Empty vstupy
    • white-space samotný je považován za Empty a validátory se tak vyjma RequiredFieldValidatoru ignorují (a CustomValidatoru, pokud má nastaveno ValidateEmptyText=“true“)

Konvence, zásady a postupy z vývojářské praxe – Slides, materiály a záznam [WUG Praha 07/2011]

Slides a materiály z přednášky pro WUG Praha z července 2011:

Záznam z přednášky je k dispozici na našem YouTube Channelu:

Health Monitoring a sledování chyb v ASP.NET webových službách (.asmx)

Jak jsem již popisoval v předchozím články, nevýhodou jinak šikovného mechanizmu Health Monitoringu je, že nesbírá chyby z aynchronních requestů a z webových služeb ASP.NET. Jak se vypořádat s prvním problémem u AJAX requestů bylo již naznačeno, podívejme se teď na problematiku webových služeb ASP.NET (.asmx). V zásadě jde opět o zachycení problémové výjimky a předání WebRequestErrorEvent.

SoapExceptionHealthMonitoringHandler (SoapExtension)

Elegantní metodou jak se dostat k odběru výjimek během zpracování webových služeb a jak je předávat mechanizmu Health Monitoringu je požití SoapExtension. Uvádím opět kód kolegy Jiřího Kandy (pomocná třída WebRequestErrorEventExt byla již definována v předchozím článku):

/// <summary>
/// V případě chyby ve zpracování web metody (webové služby) zajistí oznámení chyby health monitoringem.
/// Pozor, toto nefunguje (a chyby healthmonitoringu tak nejsou oznamovány),
/// pokud se webové služby testují v browseru!!! Pro testování nutno použít skutečného klienta webové služby (třeba service reference v konzolovce).
/// </summary>
public class SoapExceptionHealthMonitoringHandler : System.Web.Services.Protocols.SoapExtension
{
    #region ProcessMessage
    public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
    {
        try
        {
            if ((message != null) && (message.Stage == SoapMessageStage.AfterSerialize))
            {
                if (message.Exception != null)
                {
                    Exception exception = message.Exception;
                    if ((exception is SoapException) && (exception.InnerException != null))
                    {
                        exception = exception.InnerException;
                    }
                    if ((exception is HttpUnhandledException) && (exception.InnerException != null))
                    {
                        exception = exception.InnerException;
                    }
                    new WebRequestErrorEventExt(exception.Message, message, exception).Raise();
                }
            }
        }
        catch // pokud by zde nedejbože došlo k nějaké další výjimce, tak ji zamaskujeme
        {
            // NOOP
        }
    }
    #endregion

    #region GetInitializer
    public override object GetInitializer(Type serviceType)
    {
        return null;
    }

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return null;
    }
    #endregion

    #region Initialize
    public override void Initialize(object initializer)
    {
    }
    #endregion
}

…a zapojení ve web.configu potom v elementu configuration/system.web/webServices:

<webServices>
    <soapExtensionTypes>
        <add type="MyNamespace.SoapExceptionHealthMonitoringHandler, MyAssembly" priority="0" group="0" />
    </soapExtensionTypes>
</webServices>

A JE TO.