[Закрываются] скрытые функции ASP.NET

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

292
задан 22 revs, 7 users 52% 23 May 2017 в 01:54
поделиться

46 ответов

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

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
335
ответ дан John Sheehan 23 November 2019 в 01:38
поделиться

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

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

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

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

12
ответ дан Tyler 23 November 2019 в 01:38
поделиться

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

13
ответ дан Peter Mortensen 23 November 2019 в 01:38
поделиться

По умолчанию любое содержание между тегами для пользовательского элемента управления добавляется как дочерний элемент управления. Это может быть прервано в 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>
16
ответ дан Mark Cidade 23 November 2019 в 01:38
поделиться

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

43
ответ дан John K 23 November 2019 в 01:38
поделиться
  • HttpContext. Текущий будет всегда предоставлять Вам доступ к Запросу/Ответу/и т.д. текущего контекста., даже когда у Вас нет доступа к свойствам Страницы (например, от слабо связанного класса помощника).

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

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

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

73
ответ дан Marek Grzenkowicz 23 November 2019 в 01:38
поделиться

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

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

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

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

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

<%@ MasterType TypeName="MyMainMasterPage" %>

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

59
ответ дан 3 revs, 2 users 97% 23 November 2019 в 01:38
поделиться

HttpContext. Объекты как инструмент кэширования уровня запроса

58
ответ дан 2 revs 23 November 2019 в 01:38
поделиться

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

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

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

2) можно создать несколько .aspx страниц с помощью только одного общего "кода - позади" файла.

Сборка один класс .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, и наоборот, но Вы должны к remeber проверить свои средства управления на пустые указатели.

52
ответ дан Radu094 23 November 2019 в 01:38
поделиться

Можно использовать:

 Request.Params[Control.UniqueId] 

Для получения значения управления, ПРЕЖДЕ ЧЕМ состояние отображения инициализируется (Управление. Текст и т.д. будет пуст в этой точке).

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

48
ответ дан FlySwat 23 November 2019 в 01:38
поделиться

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

16
ответ дан Kilhoffer 23 November 2019 в 01:38
поделиться

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

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
34
ответ дан Chris Pietschmann 23 November 2019 в 01:38
поделиться

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

Демонстрационная разметка:

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);
    }
} 
34
ответ дан andleer 23 November 2019 в 01:38
поделиться

Использование типа файла 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; }
        }
    }
}
33
ответ дан 2 revs 23 November 2019 в 01:38
поделиться
26
ответ дан Chris Pietschmann 23 November 2019 в 01:38
поделиться

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

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

Рассматривает использование Страницы. ViewStateUserKey для противостояния нападениям с одним щелчком. Если Вы аутентифицируете свои вызывающие стороны и используете ViewState, устанавливаете Страницу. Свойство ViewStateUserKey в обработчике событий Page_Init для предотвращения нападений с одним щелчком.

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

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

нападение одного щелчка А происходит, когда взломщик создает Веб-страницу (.htm или .aspx), который содержит скрытое поле формы, названное __ СОСТОЯНИЕ ОТОБРАЖЕНИЯ, которое уже заполнено данными ViewState. ViewState может быть сгенерирован от страницы, которую взломщик ранее создал, такие как страница магазинной тележки с 100 объектами. Взломщик соблазняет не подозревающего пользователя в просмотр к странице, и затем взломщик заставляет страницу быть отправленной на сервер, где ViewState допустим. Сервер не имеет никакого способа знать что ViewState, порожденный от взломщика. Проверка ViewState и HMACs не противостоят этому нападению, потому что ViewState допустим, и страница выполняется под контекстом защиты пользователя.

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

26
ответ дан 2 revs, 2 users 91% 23 November 2019 в 01:38
поделиться

HttpContext. Текущий. IsDebuggingEnabled

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

25
ответ дан John Sheehan 23 November 2019 в 01:38
поделиться

Включенный в ASP.NET 3,5 SP1:

  • customErrors теперь поддерживает атрибут "redirectMode" со значением "ResponseRewrite". Выставочная ошибочная страница, не изменяя URL.
  • тег form теперь распознает атрибут действия. Большой для того, когда Вы используете URL, переписывая
20
ответ дан John Sheehan 23 November 2019 в 01:38
поделиться

ScottGu имеет набор приемов в http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx

19
ответ дан Mark Cidade 23 November 2019 в 01:38
поделиться
throw new HttpException(404, "Article not found");

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

119
ответ дан John Sheehan 23 November 2019 в 01:38
поделиться

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

Это - самый быстрый и самый легкий способ отобразить Ваш "Сайт Временно Недоступное" уведомление при повторном развертывании (или откате) изменения в Рабочем сервере.

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

210
ответ дан Community 23 November 2019 в 01:38
поделиться

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

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

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

70
ответ дан 23 November 2019 в 01:38
поделиться

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

<compilation optimizeCompilations="true">

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

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

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

Через здесь :

75
ответ дан 23 November 2019 в 01:38
поделиться

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>
46
ответ дан 23 November 2019 в 01:38
поделиться

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

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

17
ответ дан 23 November 2019 в 01:38
поделиться

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

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

20
ответ дан 23 November 2019 в 01:38
поделиться

Перед запуском длительной задачи проверьте, подключен ли клиент по-прежнему:

if (this.Response.IsClientConnected)
{
  // long-running task
}
45
ответ дан 23 November 2019 в 01:38
поделиться

Допустимый синтаксис, на котором дросселирует VS:

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
9
ответ дан leppie 23 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: