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