存在该问题是因为它具有历史意义,但是对于本站点而言,它不是一个很好的主题问题,因此,请勿将其用作您可以在此处提出类似问题的证据。
在边缘场景中总会有一些有用的功能,但是由于这个原因,大多数人都不了解它们。我要的是教科书通常不教授的功能。
你知道些什么?
存在该问题是因为它具有历史意义,但是对于本站点而言,它不是一个很好的主题问题,因此,请勿将其用作您可以在此处提出类似问题的证据。
在边缘场景中总会有一些有用的功能,但是由于这个原因,大多数人都不了解它们。我要的是教科书通常不教授的功能。
你知道些什么?
Answers:
在测试期间,您可以将电子邮件发送到计算机上的文件夹而不是SMTP服务器。将其放在您的web.config中:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
</smtp>
</mailSettings>
</system.net>
如果 在Web应用程序目录的根目录中放置一个名为app_offline.htm的文件,则ASP.NET 2.0+将关闭该应用程序并停止正常处理该应用程序的任何新传入请求,仅显示app_offline.htm的内容。提交所有新请求。
在重新部署(或回滚)对生产服务器的更改时,这是显示“站点暂时不可用”通知的最快,最简单的方法。
throw new HttpException(404, "Article not found");
这将被ASP.NET捕获,它将返回customErrors页面。在最近的.NET每日贴士中了解到这一点
这是最好的。将此添加到您的web.config中,以加快编译速度。这是通过此QFE发布的3.5SP1 。
<compilation optimizeCompilations="true">
快速总结:我们在ASP.NET中引入了一个新的optimizeCompilations开关,在某些情况下可以大大提高编译速度。有一些问题,因此请继续阅读以获取更多详细信息。该开关当前可作为3.5SP1的QFE使用,并将成为VS 2010的一部分。
ASP.NET编译系统采用非常保守的方法,这使得它在“顶级”文件发生更改时会抹去以前所做的任何工作。“顶级”文件包括bin和App_Code中的所有内容,以及global.asax。虽然这对于小型应用程序很好用,但对于大型应用程序几乎变得不可用。例如,某个客户遇到一种情况,即在对“ bin”程序集进行任何更改后,刷新页面需要10分钟。
为了减轻痛苦,我们添加了“优化”编译模式,该模式采用了保守得多的方法进行重新编译。
通过这里:
HttpContext.Current将始终使您能够访问当前上下文的Request / Response / etc。,即使您无权访问Page的属性(例如,从松散耦合的帮助器类)。
您可以通过调用Response.Redirect(url, false )将用户重定向到另一个页面,然后继续在同一页面上执行代码。
如果只需要一个已编译的Page(或任何IHttpHandler),则不需要.ASPX文件。只需将路径和HTTP方法设置为指向web.config文件中元素中的类即可。<httpHandlers>
甲页对象可以从被检索.ASPX文件编程通过调用PageParser.GetCompiledPageInstance(virtualPath,aspxFileName,上下文)
在内容页面中为MasterPages启用智能感知
我确信这是一个鲜为人知的黑客
大多数时候,您必须使用findcontrol方法并在要使用内容页面时将控件从内容页面投射到母版页面中, 一旦您执行此操作,MasterType指令将在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页。
建立一个class .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页(在删除VS生成的.designer.cs和.cs代码后):
<%@ 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。
您可以使用:
Request.Params[Control.UniqueId]
要获取控件的值,请先初始化viewstate(此时Control.Text等将为空)。
这对于Init中的代码很有用。
WebMethods。
您可以将ASP.NET AJAX回调用于放置在ASPX页面中的Web方法。您可以使用[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>
ASP.NET的一项鲜为人知且很少使用的功能是:
它很少使用,因为在特定情况下您需要它,但是当您需要它时,它非常方便。
有关此鲜为人知的功能的一些文章:
在ASP.NET中
使用标签映射在ASP.NET中进行标签映射
从上一篇文章中可以得出:
标记映射允许您在编译时在Web应用程序的每个页面上交换兼容的控件。一个有用的示例是,如果您有一个普通的ASP.NET控件(例如DropDownList),并且希望将其替换为派生自DropDownList的自定义控件。这可能是已自定义以提供更优化的查找数据缓存的控件。无需编辑每个Web表单并将内置的DropDownLists替换为自定义版本,您可以使ASP.NET实际上通过修改web.config来实现:
<pages>
<tagMapping>
<clear />
<add tagType="System.Web.UI.WebControls.DropDownList"
mappedTagType="SmartDropDown"/>
</tagMapping>
</pages>
HttpModules。该架构是疯狂的优雅。也许不是隐藏的功能,但仍然很酷。
您可以在.aspx页面中使用ASP.NET注释来注释掉页面的整个部分,包括服务器控件。被注释掉的内容将永远不会发送给客户端。
<%--
<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);
}
}
<%= /*code*/ %>
吗?
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#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks
考虑使用Page.ViewStateUserKey来抵抗一键式攻击。如果您对调用方进行身份验证并使用ViewState,请在Page_Init事件处理程序中设置Page.ViewStateUserKey属性,以防止一键式攻击。
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}
将属性设置为您知道每个用户唯一的值,例如会话ID,用户名或用户标识符。
当攻击者创建一个网页(.htm或.aspx),该网页包含一个名为__VIEWSTATE的隐藏表单域且已经填充ViewState数据时,就会发生一键式攻击。可以从攻击者先前创建的页面(例如包含100个项目的购物车页面)生成ViewState。攻击者诱使毫无戒心的用户浏览该页面,然后攻击者导致该页面被发送到ViewState有效的服务器。服务器无法知道ViewState源自攻击者。ViewState验证和HMAC无法抵抗这种攻击,因为ViewState有效并且页面是在用户的安全上下文下执行的。
通过设置ViewStateUserKey属性,当攻击者浏览到一个页面以创建ViewState时,该属性将初始化为他或她的名字。当合法用户将页面提交到服务器时,将使用攻击者的名称对其进行初始化。结果,ViewState HMAC检查失败,并生成异常。
base.OnInit(e);
如果您正在使用AutoEventWireup="true"
该页面,则不需要。
HttpContext.Current.IsDebuggingEnabled
这对于确定要输出哪些脚本(最小或完整版本)或在开发人员中可能需要的其他任何东西非常有用,而不是实时的。
使用configSource拆分配置文件。
您可以使用web.config文件中的configSource属性将配置元素推送到其他.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
默认情况下,自定义控件的标记之间的任何内容都将添加为子控件。可以在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>
如果您让ASP.NET生成RSS源,则有时会在页面顶部加一行。这将无法使用常见的RSS验证器进行验证。您可以通过将page指令放在页面<@Page>
底部来解决此问题。
在ASP.NET v3.5添加路由之前,您只需在页面管道中编写HTTPModule并重写请求即可创建自己的友好URL(例如BeginRequest事件)。
类似http:// servername / page / Param1 / SomeParams1 / Param2 / SomeParams2之类的URL会映射到如下所示的另一页(通常使用正则表达式)。
HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");
DotNetNuke有一个非常好的HttpModule,用于其友好的URL。对于无法部署.NET v3.5的计算机仍然有用。