Скрытые особенности ASP.NET

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

Дополнительная информация: https://stackoverflow.com/faq


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

Что вы знаете?

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 4

Здесь лучший. Добавьте это в свой web.config для более быстрой компиляции MUCH. Это сообщение 3.5SP1 через этот QFE.

<compilation optimizeCompilations="true">

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

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

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

Через здесь:

Ответ 5

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

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

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

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

Ответ 6

Режим розничной продажи на уровне machine.config:

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

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

Ответ 7

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

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

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

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

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

<%@ MasterType TypeName="MyMainMasterPage" %>

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

Ответ 8

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

Ответ 9

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

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

#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, и наоборот, но вам нужно помнить, что ваши элементы управления имеют значения null.

Ответ 10

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

 Request.Params[Control.UniqueId] 

Чтобы получить значение элемента управления, перед инициализацией viewState (Control.Text и т.д. в этой точке будет пустым).

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

Ответ 11

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>

Ответ 12

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

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

Ответ 13

Одна малоизвестная и редко используемая функция 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>

Ответ 14

HttpModules. Архитектура безумно элегантна. Возможно, это не скрытая функция, но, тем не менее, прохладно.

Ответ 15

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

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

Ответ 16

Конструктор выражений кода

Пример разметки:

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

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

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);
    }
} 

Ответ 17

Использование типа файла 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; }
        }
    }
}

Ответ 20

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

Ниже объясняется: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Рассмотрите возможность использования 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 завершается с ошибкой и генерируется исключение.

Ответ 21

HttpContext.Current.IsDebuggingEnabled

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

Ответ 22

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

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

Ответ 23

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

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

Ответ 25

Использование 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 и просто хотели, чтобы они могли изменять только несколько настроек.

ref: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

Ответ 26

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

Ответ 27

HttpContext.IsCustomErrorEnabled - замечательная функция. Я нашел ее полезной не один раз. Ниже приведена короткая публикация.

Ответ 28

По умолчанию любое содержимое между тегами для настраиваемого элемента управления добавляется в качестве дочернего элемента управления. Это можно перехватить в переопределении 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>

Ответ 29

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

Ответ 30

До добавления добавленных маршрутов ASP.NET v3.5 вы могли бы создать свои собственные дружественные URL-адреса, просто написав HTTPModule и перезапишите запрос на ранней стадии конвейера страниц (например, событие BeginRequest).

Вызывается как http://servername/page/Param1/SomeParams1/Param2/SomeParams2 будет отображаться на другой странице, как показано ниже (часто с использованием регулярных выражений).

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

DotNetNuke имеет действительно хороший HttpModule, который делает это для своих дружественных URL-адресов. По-прежнему полезно для машин, где вы не можете установить .NET v3.5.