Сегодня был выловлен совершенно эпический баг. Симптомы вкратце – в веб-приложении пропадала сессия. При этом, если на сервак заходить по айпишнику, все работало. В дело пошли фиддлер, лучшие умы и руки :)
После третьего часа поисков, решили сделать перерывчик и спокойно подумать. И в процессе обдумывания, вот что попалось на глаза:
http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx
Цитирую феерический абзац:
UPDATE 2: Another thing that can cause similar problems is if your server has a name that contains underscores. Underscores are not allowed in host names by RFC 952 and may interfere with the ability to set cookies and thus to persist sessions.
Подчеркивание из имени сервера убрали :)
P.S. Не используйте сессию в ваших веб-приложениях. Считайте это best practice :)
С появлением в С# 4 dynamic нам уже рассказали как здорово можно будет работать с COM-объектами, и динамическими языками. Однако, с помощью dynamic можно делать и совершенно другие интересные вещи :)
Итак, что же такое мультиметоды. В сети много информации, однако подана она совершенно зубодробительным и непонятным образом, со страшными словами типа multiple dispatching.
По-хорошему, слова эти надо знать. Хотя есть и другие мнения на этот счет. Недавно вот прочитал на веселом ресурсе habrahabr.ru про то, что “Паттерны – это рутины, для тех, кто не умеет программировать”. Рекомендую к прочтению, хорошее настроение обеспечено.
Самое простое определение мультиметодов, которое мне доводилось видеть, звучало так: Мультиметоды – это виртуальные методы, принадлежащие сразу нескольким классам. А объяснять долго не буду, просто посмотрите на код
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4
5 namespace NewC4FeaturesTest
6 {
7 class A {}
8
9 class B : A {}
10
11 class C : A {}
12
13 class Program
14 {
15 static void Main(string[] args)
16 {
17 Program.Dispatch(new B(), new C());
18 Console.ReadLine();
19 }
20
21 public static void Dispatch(A a, A b)
22 {
23 dynamic x = a;
24 dynamic y = b;
25 multiMethod(a, b);
26 multiMethod(x, y);
27 }
28
29 private static void multiMethod(A a, A b)
30 {
31 Console.WriteLine(string.Format("A and A"));
32 }
33
34 private static void multiMethod(B a, A b)
35 {
36 Console.WriteLine(string.Format("B and A"));
37 }
38
39 private static void multiMethod(A a, C b)
40 {
41 Console.WriteLine(string.Format("A and C"));
42 }
43
44 private static void multiMethod(B a, C b)
45 {
46 Console.WriteLine(string.Format("B and C"));
47 }
48 }
49 }
Если у вас уже установлена Beta 2 Visual Studio 2010, можно скопипастить код, и посмотреть как он работает. Первый вызов всегда приведет к работе метода на строке 29 (“A and A”), по понятным причинам. А вот второй вызов в рантайме разберется, что надо вызвать метод на строке 44 (“B and C”).
Таким образом, можно избежать if’ов и switch’ей. Некоторые даже говорят, что это практически pattern matching light.
Однако, есть и темная сторона :) Если мы закомментируем строки 39 – 47, то второй вызов выведет нам “B and A” (строка 34). Понятно, почему это происходит – этот метод более специфичен, чем “A and A”. Однако, если мы раскомментируем 39 – 42, то второй вызов приведет к выбросу исключения. Потому что непонятно, какое совпадение аргумента важнее – B, или С.
Именно по такой причине прогрессивное человечество придумало Visitor. При этом мы должны гарантированно описать все комбинации, иначе компилятор даст нам по рукам. Но реализацию паттерна простой не назовешь.
Если все это показалось вам интересным, в следующий раз приведу реализацию Visitor с помощью dynamic.
Для вставки в блог листинга кода я еще не встречал ничего лучше, чем аддон для Visual Studio CopySourceAsHtml
Работает он просто здорово, и все было прекрасно. Но после выхода новой беты Visual Studio 2010 возникла проблема – этот аддон не работает в новой студии после установки. К счастью, есть довольно простой способ заставить его работать.
Для начала, нужно скачать и установить аддон. Сделать это можно по ссылке выше, с сайта проекта на codeplex.
Затем откройте директорию “Мои Документы” (My Documents в англоязычной OS). Там должны быть директории Visual Studio 2008 и Visual Studio 2010.
Внутри Visual Studio 2010 нужно создать поддиректорию Addins (если ее еще нет), и скопировать туда файл CopySourceAsHtml.AddIn из аналогичной поддиректории Visual Studio 2008.
Затем, откройте его в Visual Studio. Вы увидите следующий xml-код
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility">
<HostApplication>
<Name>Microsoft Visual Studio Macros</Name>
<Version>9.0</Version>
</HostApplication>
<HostApplication>
<Name>Microsoft Visual Studio</Name>
<Version>9.0</Version>
</HostApplication>
<Addin>
<FriendlyName>CopySourceAsHtml</FriendlyName>
<Description>Adds support to Microsoft Visual Studio 2008 for copying source code, syntax highlighting, and line numbers as HTML.</Description>
<Assembly>JTLeigh.Tools.Development.CopySourceAsHtml, Version=3.0.3215.1, Culture=neutral, PublicKeyToken=bb2a58bdc03d2e14, processorArchitecture=MSIL</Assembly>
<FullClassName>JTLeigh.Tools.Development.CopySourceAsHtml.Connect</FullClassName>
<LoadBehavior>1</LoadBehavior>
<CommandPreload>0</CommandPreload>
<CommandLineSafe>0</CommandLineSafe>
</Addin>
</Extensibility>
Выделенные большим жирным шрифтом 9.0 нужно заменить на 10.0
Сохраняем файл, выходим из студии, и запускаем ее заново. После этой процедуры при выделении куска кода и щелчка правой кнопкой мыши, в контекстном меню появится пункт Copy As Html…
Enjoy!