admax

admax
Карма 2924
Имя Евгений
Возраст Неизвестно
Сайт Неизвестно
Twitter @codehelper_ru
Участвует в проекте 1117 дн., 1 час., 29 мин.
Последняя активность 417 дн., 17 час., 59 мин. назад
О себе ничего не указано

Ответы

Новые Лучшие
1
2
3
4
5
6
...
13
Перейти к вопросу →

Для кеширования в ASP.NET MVC служит атрибут [OutputCache], который применяется к методу или самому классу котроллера:

public class HomeController : Controller
{
    [OutputCache(Duration=10)]
    public ActionResult Index()
    {
        return View();
    }
}

Параметры атрибута:

Duration — время, в течении которого возвращается кешированный результат вместо обычного;

VaryByParam — позволяет указать аргумент action-метода, для каждого значения которого нужно создавать собственный кеш. Например при такой реализации:

[OutputCache(Duration=10)]
public ActionResult Details(long id){
    // Action logic
}

результат, возвращаемый методом, будет кешироваться один раз для всех возможных вариантов аргумента id. Чтобы предотвратить такое поведение используется параметр VaryByParam:

[OutputCache(Duration=10, VaryByParam="id")]
public ActionResult Details(long id){
    // Action logic
}

Location — позволяет указать место хранения кеша. Возможные значения:

  • Any — любое из возможных мест (значение по умолчанию)
  • Client — кеш хранится в браузере клиента
  • Downstream — кеш может быть сохранен в любом HTTP 1.1 cache-совместимом устройстве, кроме основного сервера. Сюда могут включаться прокси-сервера и т.п.
  • Server — кеш сохраняется на том же сервере, где был сформирован ответ для клиента;
  • None — кеш не сохраняется;
  • ServerAndClient — кеш может сохраняться или на самом сервере или в браузере;

CacheProfile — задает имя секции конфигурации с настройками кеша. Позволяет перенести все настройки из самого атрибута в файл Web.config:

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="HomePageCacheProfile" duration="3600" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

public class HomeController : Controller
{
    [OutputCache(CacheProfile="HomePageCacheProfile")]
    public ActionResult Index()
    {
        // Action logic
    }
}
Перейти к вопросу →

Вариант 1: Использовать Output Cache Substitution Feature

Атрибут OutputCache — это надстройка над механизмом кеширования старого доброго ASP.NET (во всяком случае для MVC версии 1.0). Поэтому все расширенные техники кеширования базируются также на старых asp.net`овских фишках.

Так, частичное кеширование работает за счет механизма Output Cache Substitution Feature (Подробнее можно прочитать в классическом опусе Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature).

Были созданы MVC-обертки над механизмом Output Cache Substitution (Еще более классический опус: Donut Caching in ASP.NET MVC). Сейчас (версия MVC 1.0) эти обертки можно найти в ASP.NET MVC Futures. Расширения и хелперы позволяют писать конструкции вида:

<!-- Это кешируется (атрибут OutputCache применен к конроллеру) -->
<%= DateTime.Now %>

<!-- Это не кешируется -->
<%= Html.Substitute(c => DateTime.Now.ToString()) %>

Однако, такой подход имеет серьезный недостаток. Делегат, который возвращает динамические данные должен работать без контекста. То есть он не может обращаться к ViewData или TempData. В принципе это логично, потому что когда страница достается из кеша, никаких данных, передаваемых контроллером, она уже не имеет. Отсюда следует, что Html.Substitute() подходит только для вывода даты генерации страницы, но никак не для частичного кеширования. Есть способ подружить Html.Substitute() с TempData, но на бОльшее расчитывать не приходится.

Перейти к вопросу →

Вариант 2: Частичный рендеринг и кеширование

Как известно, в ASP.NET MVC предусмотрена возможность частичного рендеринга страницы при помощи хелпера Html.RenderAction. Этот метод встраивает в страницу результат работы определенного action-метода. Сама концепция RenderAction, пришедшая из Ruby, является порочной (не зря из Ruby ее давно выкинули), потому что перемещает логику формирования результата из контроллера в вид. Однако, есть академически чистый аналог RenderAction — это SubController из MvcContrib.

Используя RenderAction или SubController в связке со стандартным механизмом кеширования (атрибут OutputCache). Можно организовать кеширование части страницы. Для этого нужно:

  • выделить динамическую часть в отдельный action,
  • пометить этот action атрибутом OutputCache
  • выводить результат на странице с помощью RenderAction или SubController.

К сожалению, такое решение не будет работать, потому что ASP.NET закеширует всю страницу целиком, а не ее часть. Это известная проблема, но в ASP.NET MVC 1.0 она не решена. Есть два способа борьбы с этим багом:

  • Использовать решение, описанное в статье Donut Hole Caching in ASP.NET MVC. Недостатки — работает только для WebFormsViewEngine и требует неочевидных изменений в видах.
  • Отказаться от стандартного атрибута OutputCache и использовать свой аналогичный атрибут. Например такой, как описан в статье Partial Output Caching in ASP.NET MVC)
Перейти к вопросу →

Да, для этого служит библиотека Recoil.

Recoil — это fluent-расширение интерфейса Spring.NET. Библиотека предоставляет легкий в использовании каркас для определения связей между объектами (wires) в коде, так что конфигуровочный код проверяется во время компиляции и вы можете использовать всю мощь рефакторинга (например, с помощью ReSharper), не боясь, что XML-конфигурация перестанет работать.

Recoil позволяет заменить такой синтаксис:

<object id="MyAssembly.MyNamespace.IBar"
      type="MyAssembly.MyNamespace.BarFactory,  MyAssembly"
      factory-method="Create">
    <property name="TestProperty" value="TestValue"/>
    <property name="ListProperty">
           <list element-type="MyAssembly.MyNamespace.Foo">
                   <object type="MyAssembly.MyNamespace.Foo">
                          <constructor-arg name="Name" value="A Foo" />
                   </object>
                   <ref object="SpecialFoo"/>
           </list>
    <property/>
</object>

таким:

Define(() => BarFactory.Create())
            .As<IBar>()
            .Set(b => b.TestProperty).To(() => "TestValue")
            .Set(b => b.ListProperty).To(() => new List {
                                                            new Foo("A Foo"),
                                                            Wire<IFoo>("SpecialFoo")
                                                        });

Текст взят из поста Recoil 1.1.0 released!

Перейти к вопросу →

Нужно добавить к ссылке на ресурс строку с параметром версии. Например так:

<link href="/Content/Site.css?v=1.0.0.208" rel="stylesheet" type="text/css" />

Строка v=1.0.0.208 соответствует версии сайта. Таким образом, браузер успешно закеширует этот ресурс, но при обновлении версии сайта адрес ресурса изменится и браузер его перезагрузит.

Перейти к вопросу →

Пример POST запроса:

var request = (HttpWebRequest) HttpWebRequest.Create("http://url");
request.Method = "POST";
const string command = @"Текст POST запроса";
byte[] bytes = Encoding.ASCII.GetBytes(command);
request.ContentLength = bytes.Length;
using (var stream = request.GetRequestStream())
{
    stream.Write(bytes, 0, bytes.Length);
}
using(var stream = new StreamReader(request.GetResponse().GetResponseStream()))
{
    Console.WriteLine(stream.ReadToEnd());
}
Перейти к вопросу →

Есть такой инструмент Altova UModel® 2010. Он хоть и платный, но если нужно срочно сгенерить несколько диаграмм, то подойдет идеально. Может импортировать исходники из папки или файла проекта (.NET или Java), может строить диаграммы из бинарных файлов. Генерирует картинки из диаграмм безо всяких водяных знаков и тп, то есть на картинке диаграммы не видно, что использована trial версия.

Перейти к вопросу →

Вот пример кода:

public bool SetAcl(string pathname, string userRights, string username, bool inheritSubDirectories)
{
    if (string.IsNullOrEmpty(pathname))
    {
        return false;
    }

    pathname = pathname.TrimEnd('\\');
    var rights = (FileSystemRights)0;
    if (userRights == "R")
    {
        rights = FileSystemRights.ReadAndExecute;
    }
    else if (userRights == "C")
    {
        rights = FileSystemRights.ChangePermissions;
    }
    else if (userRights == "F")
    {
        rights = FileSystemRights.FullControl;
    }

    var accessRule = new FileSystemAccessRule(username, rights,
                                InheritanceFlags.None,
                                PropagationFlags.NoPropagateInherit,
                                AccessControlType.Allow);
    var info = new DirectoryInfo(pathname);
    var security = info.GetAccessControl(AccessControlSections.Access);
    bool result;
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result);
    if (!result)
    {
        return false;
    }

    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit;
    if (inheritSubDirectories)
    {
        iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
    }
    accessRule = new FileSystemAccessRule(username, rights,
                                iFlags,
                                PropagationFlags.InheritOnly,
                                AccessControlType.Allow);

    security.ModifyAccessRule(AccessControlModification.Add, accessRule, out result);
    if (!result)
    {
        return false;
    }

    info.SetAccessControl(security);
    return true;
}

Код основан на материале поста Setting ACE/ACL permissions in .NET 2.0

Перейти к вопросу →

По умолчанию клиент WCF использует настройки proxy, которые заданы в системе. То есть те, которые устанавливаются в Internet Explorer. Если требуется задать специфичные настройки proxy, то можно использовать параметр proxyAddress и указать, что не нужно использовать системные настройки (useDefaultWebProxy=false):

<basicHttpBinding>
  <binding name="MyClientBinding" proxyAddress="http://proxy:8080" useDefaultWebProxy="false">
  </binding>
</basicHttpBinding>

Можно также вынести эти настройки в конфигурацию binding:

<binding name="CommonBinding">
    <binaryMessageEncoding />
    <httpTransport proxyAddress="http://proxy:8080" useDefaultWebProxy="false" />
</binding>

Можно также определить глобальные настройки прокси для всех ендпойнтов:

<system.net>
  <defaultProxy useDefaultCredentials="true">
    <proxy bypassonlocal="False" proxyaddress="http://proxy:8080" />
  </defaultProxy>
</system.net>

Взято из статьи Configuring a proxy-server for WCF. Также в статье подмечена интересная деталь: если клиент работает с локальным сервером, то настройки прокси игнорируются и все запросы идут напрямую. Чтобы избежать такой ситуации нужно в адресе сервера писать не localhost, а имя машины.

Перейти к вопросу →

Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес

Приемы объектно-ориентированного проектирования. Паттерны проектирования

Знаменитые паттерны GoF. Книга, которая произвела революцию в отрасли. И это при том, что (по признанию авторов) в ней нет ничего нового — только систематизация знаний и типовых подходов проектирования. Кроме самих паттернов, книга открывает глаза на основы объектно-ориентированного дизайна, принципы проектирования.

Приемы объектно-ориентированного проектирования. Паттерны проектирования


1
2
3
4
5
6
...
13
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.