Скрытые возможности ASP.NET

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

Больше информации: https://stackru.com/faq


Всегда есть функции, которые могут быть полезны в дополнительных сценариях, но по этой причине большинство людей их не знают. Я прошу об особенностях, которые обычно не преподаются в учебниках.

Какие из них вы знаете?

53 ответа

Во время тестирования вы можете отправлять электронные письма в папку на вашем компьютере вместо SMTP-сервера. Поместите это в ваш web.config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

Если вы поместите файл с именем app_offline.htm в корень каталога веб-приложения, ASP.NET 2.0+ закроет приложение и прекратит нормальную обработку любых новых входящих запросов для этого приложения, показывая только содержимое app_offline.htm. файл для всех новых запросов.

Это самый быстрый и простой способ отобразить ваше уведомление "Сайт временно недоступен" при повторном развертывании (или откате) изменений на производственном сервере.

Кроме того, как указал Mark Cidade, убедитесь, что у вас есть как минимум 512 байт содержимого в файле, чтобы IE6 правильно его отобразил.

throw new HttpException(404, "Article not found");

Это будет перехвачено ASP.NET, который вернет страницу customErrors. Об этом узнал в недавнем посте "Совет дня.NET"

Вот самый лучший. Добавьте это в ваш web.config для НАМНОГО более быстрой компиляции. Это пост 3.5SP1 через этот QFE.

<compilation optimizeCompilations="true">

Краткое резюме: мы представляем новый переключатель optimizeCompilations в ASP.NET, который может значительно повысить скорость компиляции в некоторых сценариях. Есть некоторые уловы, так что читайте дальше для более подробной информации. Этот переключатель в настоящее время доступен в качестве QFE для 3.5SP1 и станет частью VS 2010.

Система компиляции ASP.NET использует очень консервативный подход, который приводит к удалению любой предыдущей работы, которую она выполняла каждый раз, когда изменяется файл "верхнего уровня". Файлы верхнего уровня включают в себя что угодно в bin и App_Code, а также в global.asax. Хотя это хорошо работает для небольших приложений, оно становится практически непригодным для очень больших приложений. Например, клиент столкнулся со случаем, когда потребовалось 10 минут для обновления страницы после внесения каких-либо изменений в сборку "bin".

Чтобы облегчить боль, мы добавили "оптимизированный" режим компиляции, который использует гораздо менее консервативный подход к перекомпиляции.

Через здесь:

  • HttpContext.Current всегда предоставит вам доступ к запросу / ответу и т. Д. Текущего контекста, даже если у вас нет доступа к свойствам страницы (например, из слабосвязанного вспомогательного класса).

  • Вы можете продолжить выполнение кода на той же странице после перенаправления пользователя на другую, вызвав Response.Redirect (url, false )

  • Вам не нужны файлы .ASPX, если все, что вам нужно, это скомпилированная страница (или любой IHttpHandler). Просто установите путь и методы HTTP, чтобы указать на класс в <httpHandlers> элемент в файле web.config.

  • Объект Page можно извлечь из файла .ASPX программным путем, вызвав PageParser.GetCompiledPageInstance(virtualPath,aspxFileName,Context).

Режим розничной торговли на уровне machine.config:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

Переопределяет параметры web.config для принудительного включения отладки в false, включает настраиваемые ошибки и отключает трассировку. Больше не нужно забывать изменять атрибуты перед публикацией - просто оставьте их все настроенными для среды разработки или тестирования и обновите настройки розничной торговли.

Включение intellisense для MasterPages на страницах содержимого
Я уверен, что это очень мало известный взломать

Большую часть времени вам нужно использовать метод findcontrol и приводить элементы управления на главной странице со страниц содержимого, когда вы хотите их использовать, директива MasterType включит intellisense в Visual Studio, как только вы перейдете к этому.

просто добавьте еще одну директиву на страницу

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

Если вы не хотите использовать виртуальный путь и вместо него использовать имя класса,

<%@ MasterType TypeName="MyMainMasterPage" %>

Получить полную статью здесь

HttpContext.Items как инструмент кэширования на уровне запросов

В моей голове выделяются две вещи:

1) Вы можете включать и выключать трассировку из кода:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) Вы можете создать несколько страниц.aspx, используя только один общий файл code-behind.

Создайте один файл класса.cs:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

и затем вы можете иметь любое количество страниц.aspx (после удаления кода.designer.cs и.cs, созданных VS):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

У вас могут быть элементы управления в ASPX, которые не отображаются в Class1, и наоборот, но вам нужно помнить, чтобы проверить свои элементы управления на наличие нулей.

Ты можешь использовать:

 Request.Params[Control.UniqueId] 

Чтобы получить значение элемента управления BEFORE viewstate инициализируется (Control.Text и т. Д. На этом этапе будут пустыми).

Это полезно для кода в Init.

WebMethods.

Вы можете использовать обратные вызовы ASP.NET AJAX для веб-методов, размещенных на страницах ASPX. Вы можете украсить статический метод с помощью атрибутов [WebMethod()] и [ScriptMethod()]. Например:

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List<string> GetFruitBeginingWith(string letter)
{
    List<string> products = new List<string>() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

Теперь на вашей странице ASPX вы можете сделать это:

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
    </div>
</form>

И вызовите ваш метод на стороне сервера через JavaScript, используя:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>

Убедитесь, что клиент все еще подключен, прежде чем запускать долгосрочную задачу:

if (this.Response.IsClientConnected)
{
  // long-running task
}

Одна малоизвестная и редко используемая функция ASP.NET:

Отображение тегов

Он редко используется, потому что есть только конкретная ситуация, когда он вам нужен, но когда вам это нужно, это очень удобно.

Некоторые статьи об этой малоизвестной особенности:

Отображение тегов в ASP.NET
Использование сопоставления тегов в ASP.NET 2.0

и из этой последней статьи:

Сопоставление тегов позволяет менять совместимые элементы управления во время компиляции на каждой странице вашего веб-приложения. Полезный пример - если у вас есть стандартный элемент управления ASP.NET, например, DropDownList, и вы хотите заменить его настраиваемым элементом управления, производным от DropDownList. Это может быть элемент управления, который был настроен для обеспечения более оптимизированного кэширования данных поиска. Вместо того, чтобы редактировать каждую веб-форму и заменять встроенные DropDownLists своей пользовательской версией, вы можете сделать так, чтобы ASP.NET сделал это за вас, изменив web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

HttpModules. Архитектура безумно элегантна. Может быть, не скрытая особенность, но круто тем не менее.

Вы можете использовать комментарии ASP.NET на странице.aspx, чтобы закомментировать полные части страницы, включая элементы управления сервером. И закомментированное содержимое никогда не будет отправлено клиенту.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

Построитель выражений кода

Образец разметки:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

Настоящая прелесть конструктора выражений кода в том, что вы можете использовать привязку данных как выражения в ситуациях без привязки данных. Вы также можете создавать другие построители выражений, которые выполняют другие функции.

web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

Класс cs, который делает все это возможным:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

Использование типа файла ASHX:
Если вы хотите просто вывести базовый html или xml без прохождения через обработчики событий страницы, вы можете просто реализовать HttpModule.

Назовите страницу как SomeHandlerPage.ashx и просто поместите в нее код ниже (только одну строку)

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

Тогда файл кода

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}

Настройка свойств управления сервером на основе целевого браузера и многое другое.

<asp:Label runat="server" ID="labelText" 
    ie:Text="This is IE text" 
    mozilla:Text="This is Firefox text" 
    Text="This is general text" 
/>

Этот один застал меня врасплох.

Я работал над приложением asp.net, которое прошло проверку безопасности ведущей компанией по безопасности, и я научился этому простому приему предотвращения менее известной, но важной уязвимости безопасности.

Нижеприведенное объяснение: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation

Попробуйте использовать Page.ViewStateUserKey для противодействия атакам одним щелчком мыши. Если вы аутентифицируете своих абонентов и используете ViewState, установите свойство Page.ViewStateUserKey в обработчике события Page_Init, чтобы предотвратить атаки одним щелчком.

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

Установите для свойства значение, которое, как вы знаете, является уникальным для каждого пользователя, например идентификатор сеанса, имя пользователя или идентификатор пользователя.

Атака одним щелчком происходит, когда злоумышленник создает веб-страницу (.htm или.aspx), которая содержит скрытое поле формы с именем __VIEWSTATE, которое уже заполнено данными ViewState. ViewState можно создать на странице, которую злоумышленник ранее создал, например на странице корзины для покупок, содержащей 100 элементов. Злоумышленник заманивает ничего не подозревающего пользователя к просмотру страницы, а затем злоумышленник отправляет страницу на сервер, на котором действует ViewState. Сервер не может знать, что ViewState произошел от злоумышленника. Проверка ViewState и HMAC не противостоят этой атаке, потому что ViewState действителен и страница выполняется в контексте безопасности пользователя.

Устанавливая свойство ViewStateUserKey, когда злоумышленник просматривает страницу, чтобы создать ViewState, свойство инициализируется его или ее именем. Когда законный пользователь отправляет страницу на сервер, она инициализируется именем злоумышленника. В результате проверка ViewState HMAC завершается неудачно, и создается исключение.

HttpContext.Current.IsDebuggingEnabled

Это отлично подходит для определения того, какие скрипты выводить (минимальные или полные версии) или что-то еще, что вы можете захотеть в dev, но не использовать.

Включено в ASP.NET 3.5 SP1:

  • customErrors теперь поддерживает атрибут "redirectMode" со значением "ResponseRewrite". Показывает страницу ошибки без изменения URL.
  • Тег формы теперь распознает атрибут действия. Отлично подходит, когда вы используете переписывание URL

Свойство DefaultButton в Панелях.

Он устанавливает кнопку по умолчанию для конкретной панели.

Использование configSource для разделения файлов конфигурации.

Вы можете использовать атрибут configSource в файле web.config для передачи элементов конфигурации в другие файлы.config, например, вместо:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

... вы можете хранить весь раздел appSettings в другом файле конфигурации. Вот новый web.config:

    <appSettings configSource="myAppSettings.config" />

myAppSettings.config файл:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

Это очень полезно для сценариев, когда вы развертываете приложение для клиента, и вы не хотите, чтобы они мешали самому файлу web.config, а просто хотите, чтобы они могли изменять только несколько настроек.

ссылка: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

У ScottGu есть куча трюков на http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx

Атрибут MaintainScrollPositionOnPostback в директиве Page. Он используется для поддержания позиции прокрутки на странице aspx через постбэки.

По умолчанию любое содержимое между тегами для пользовательского элемента управления добавляется в качестве дочернего элемента управления. Это может быть перехвачено в переопределении AddParsedSubObject() для фильтрации или дополнительного анализа (например, текстового содержимого в LiteralControls):

    protected override void AddParsedSubObject(object obj)
     { var literal = obj as LiteralControl;
       if (literal != null) Controls.Add(parseControl(literal.Text));
       else base.AddParsedSubObject(obj);
     }

...

   <uc:MyControl runat='server'>
     ...this text is parsed as a LiteralControl...
  </uc:MyControl>

HttpContext.IsCustomErrorEnabled - это классная функция. Я нашел ее полезной более одного раза. Вот небольшой пост об этом.

Если у вас есть ASP.NET, генерирующий канал RSS, он иногда помещает дополнительную строку вверху страницы. Это не будет проверяться с обычными валидаторами RSS. Вы можете обойти это, поместив директиву страницы <@Page> внизу страницы.

Моя команда использует это как хак:

WebRequest myRequest = WebRequest.Create("http://www.google.com");
WebResponse myResponse = myRequest.GetResponse();
StreamReader sr = new StreamReader(myResponse.GetResponseStream());

// here's page's response loaded into a string for further use

String thisReturn = sr.ReadToEnd().Trim();

Он загружает ответ веб-страницы в виде строки. Вы можете отправить в параметры сообщения тоже.

Мы используем его вместо ASCX/AJAX/WebServices, когда нам нужно что-то дешевое и быстрое. По сути, это быстрый способ доступа к веб-контенту на разных серверах. На самом деле, мы только что назвали его "Web-сервисом Redneck" вчера.

Другие вопросы по тегам