关于.net:ASP.NET的隐藏功能

Hidden Features of ASP.NET

This question exists because it has
historical significance, but it is not
considered a good, on-topic question
for this site, so please do not use it
as evidence that you can ask similar
questions here.

More info: https://stackoverflow.com/faq

在边缘场景中总是有一些有用的特性,但正因为如此,大多数人并不了解它们。我要的是课本上没有教过的功能。

你知道什么?

  • 好问题,我希望能投几次票!
  • 同意。我喜欢这样的线。这个框架有如此之深,以至于你有时会惊讶于那些你不知道的东西。
  • 我从这条线索的反应中学习了很多很酷的新技巧-谢谢!:)
  • 而不是"隐藏……的特征"这些东西不应该被命名为"鲜为人知的……特性",因为大多数答案都在msdn或其他地方有很好的文档记录,只是通常不知道或不使用。
  • 请参阅meta.stackexchange.com/questions/56669/…、meta.stackexchange.com/questions/57226/…,以及相关的meta文章,以了解关于适当性和结束的讨论。


测试时,您可以将电子邮件发送到计算机上的文件夹,而不是SMTP服务器。将其放入web.config:

1
2
3
4
5
6
7
<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp" />
        </smtp>
    </mailSettings>
</system.net>

  • 真的吗?我想安装SMTP服务器dumbster伪造,样。我隐藏的宝石。
  • 任何人知道,如果你可以指定你的目录的UNC位置A股?
  • 更好的是,你把这箱检查machine.config的dev的,所以你没有改变你的web.config文件在每个应用程序创建的。
  • 你能设置它,所以它只能是本在本地主机?这样你不改变它的每一次?
  • 有没有设置的房间。你必须使用其他方法不同的配置管理(Web部署项目的建设任务,等等)
  • "这是真正的最大Toro)宝石:……注意,你可以在那算代码(如果你是在所有的属性在任何SmtpClient均值)
  • 我想你可以做这样的东西通过IIS。我一定是弄错了,我只记得去一个文件夹的电子邮件。
  • 我想你可以配置SMTP服务器的文件夹和它滴在A为好,但它不是那么它是万维网服务器的其他应用程序。
  • 这是很有趣的。我们使用真正的SMTP服务器使用它在测试和果酱。


如果放置名为app_offline.htm的文件在Web应用程序目录的根目录中,ASP.NET 2.0+将关闭应用程序并停止正常处理该应用程序的任何新传入请求,仅显示所有新请求的app_offline.htm文件的内容。

这是在将更改重新部署(或回滚)到生产服务器时显示"站点暂时不可用"通知的最快和最简单的方法。

另外,正如marxidad所指出的,确保文件中至少有512字节的内容,这样IE6就能正确地呈现它。

  • 不要忘记IE"友好"消息的解决方法:tinyurl.com/app-offline-friendly
  • 哎哟!在使用Moss 2007时要小心。它仅适用于自上次重新启动IIS以来已被访问的页。因此,如果将此页面添加到WSS虚拟根目录中,然后尝试打开以前未访问过的页面,则会得到404。
  • 这提示了@马克从Scott Guthrie的感觉,如果你是慷慨的帮助,你会避免很多SharePoint开发者在该情况下,如果你的文章:在古weblogs.asp.net /档案/ scottgu/2005/10/06/426755.aspx
  • 另外,这将触发一个应用程序是循环和关闭任何域的开放式数据库连接后,所有的请求已经完成。
  • 有一个"这一_ offline.htm:IIS返回应用程序内容的HTTP状态代码404个。A我徒步旅行,对于搜索引擎索引您的网站,而你在这的离线模式,你不可能预测到。但它的伟大工程为我的私人企业的Web应用程序。


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

这将被ASP.NET捕获,它将返回CustomErrors页。在最近的.NET每日小贴士文章中了解到这一点

  • 一些开发人员可能会争辩说,最好在httpContext.Response中手动包装事情,而不是抛出一个异常,这在.NET书籍中是非常昂贵的操作。
  • 这不是个坏形式吗?您显示的是404错误,而您想要显示一个错误/异常。
  • 我能想到的一个例子是,如果有人恶意地弄乱了参数并把一些无效的东西放进去,那么您可能想要一个通用的404,而不是一个特定的错误。
  • 纯粹是因为我现在知道了.NET每日提示网站。
  • 它只在您将其放入httpmodule或httphandler时工作


这是最好的。将它添加到web.config中,可以更快地编译。这是通过该QFE发布的3.5SP1。

1
<compilation optimizeCompilations="true">

Quick summary: we are introducing a
new optimizeCompilations switch in
ASP.NET that can greatly improve the
compilation speed in some scenarios.
There are some catches, so read on for
more details. This switch is
currently available as a QFE for
3.5SP1, and will be part of VS 2010.

The ASP.NET compilation system takes a
very conservative approach which
causes it to wipe out any previous
work that it has done any time a ‘top
level’ file changes. ‘Top level’ files
include anything in bin and App_Code,
as well as global.asax. While this
works fine for small apps, it becomes
nearly unusable for very large apps.
E.g. a customer was running into a
case where it was taking 10 minutes to
refresh a page after making any change
to a ‘bin’ assembly.

To ease the pain, we added an
‘optimized’ compilation mode which
takes a much less conservative
approach to recompilation.

通过这里:

  • 这是"默认情况下"与2010年还是我应该尝试它?


  • httpContext.current将始终为您提供对当前上下文的请求/响应等的访问,即使您没有访问页面属性的权限(例如,从松散耦合的助手类)。

  • 通过调用response.redirect(url,false),将用户重定向到另一个页面后,可以继续在同一页面上执行代码。

  • 如果您只需要一个已编译的页面(或任何IHttphandler),则不需要.aspx文件。只需设置path和http方法指向web.config文件中元素中的类。

  • 可以通过调用pageParser.getCompiledPageInstance(virtualPath、aspxFileName、context)以编程方式从.aspx文件中检索页面对象。

  • 关于response.redirect(url,false)-这是我很长时间以来所希望的。我不知道我是怎么错过的,但是
  • 有人能解释一下你会怎么做吗?我知道它有一些价值,但我不明白为什么…
  • 如果要将用户重定向到其他地址,但仍有一些后端处理要做(例如,在报表继续在后台生成报表时重定向到报表的生成状态页的报表生成请求)
  • 有人能为pageParser.getCompiledPageInstance(..)解释一个有用的情况吗?文档说它是用于基础设施的-它返回一个IHttphandler类型,所以我不知道如何实际使用它。
  • @JDK:我以前在重写*.aspx请求的默认处理程序时使用过它,这样我就可以使用内存中的动态IHttphandler对象,也可以对物理的*.aspx文件使用getCompiledPageInstance()。
  • @马克:谢谢你的信息。有一点我仍然不清楚:您是将它转换成另一种数据类型来有效地使用它,还是继续通过IHttphandler数据类型引用它?
  • @JDK:我只是在IHttphandler接口上调用processRequest()方法。


machine.config级别的零售模式:

1
2
3
4
5
<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

重写web.config设置以强制调试为false,打开自定义错误并禁用跟踪。在发布之前不要忘记更改属性-只需将它们全部配置为开发或测试环境,并更新生产零售设置。

  • 我有时会忘记在发布前将编译调试更改为false,这会对性能产生负面影响。没问题了!


为内容页中的母版页启用IntelliSense
我相信这是一个鲜为人知的黑客

大多数情况下,如果要使用findcontrol方法并从内容页强制转换母版页中的控件,则mastertype指令将在Visual Studio中启用IntelliSense。

只需再向页面添加一个指令

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

如果不想使用虚拟路径,而是使用类名,那么

1
<%@ MasterType TypeName="MyMainMasterPage" %>

在这里得到完整的文章

  • 使用findcontrol有时会很忙,谢谢您提供的这个好提示!
  • 使用它可能会导致意外行为。参见stackoverflow.com/questions/1998931/&hellip;
  • 就我个人而言,我认为应该让人们不知道这个功能,它将页面和母版页结合起来。如果您最终使用了母版页的属性/方法,然后更改了母版页,那么您将面临维护噩梦。
  • @菲尔:有时候是需要的,对母版页进行静态类型的访问比findcontrol方法要好得多。至少你能得到编译器消息并能快速修复它。


作为请求级缓存工具的httpContext.items

  • 这也是我的观点,我在嵌套控件中使用它来传递/接收请求级别的信息。我也在MVC中使用它来存储要附加的JS文件列表,基于部分视图。
  • 当我使用ASP.NET路由将从URL获取的参数传递到我的页面时,使用这个方法。(不支持MVC)非常适合URL重写,而且非常灵活。
  • 嗯,想一想我可以用这个代替会话的地方——TA!


有两件事在我的脑海里很突出:

1)您可以从代码中打开和关闭跟踪:

1
2
3
4
5
6
7
#ifdef DEBUG
   if (Context.Request.QueryString["DoTrace"] =="true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2)您只能使用一个共享的"代码隐藏"文件来构建多个.aspx页面。

生成一个类.cs文件:

1
2
3
4
5
6
7
8
9
10
11
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代码之后):

1
2
3
4
5
6
  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     
     </asp: TextBox  >
     
     </form>

您可以在ASPX中拥有不在Class1中出现的控件,反之亦然,但您需要重新记忆以检查控件是否为空。

  • 我本来会投这个票的,但是没票了。我会尽量记住回来投票。我不知道我们可以为多个页面提供相同的代码隐藏文件。不确定,这是如何工作的。
  • 其他人是否认为允许您从URL激活跟踪存在安全风险?(1)我不会对这个问题投反对票,但理解其中的风险很重要。
  • 绝对地,你应该把代码放在一个ifdef debug-endif块中。
  • 很好的评论,指出了安全方面。
  • 为什么从URL激活跟踪存在安全风险?怎么能用它来伤害我?


你可以使用:

1
 Request.Params[Control.UniqueId]

在初始化viewstate之前获取控件的值(此时control.text等将为空)。

这对于init中的代码很有用。

  • viewstate初始化不处理request.params。在引发控件实现的IPostBackDataHandler的方法LoadPostData之前使用它。


WebMethods。

可以使用ASP.NET AJAX回调放置在ASPX页中的Web方法。可以使用[WebMethod()]和[ScriptMethod()]属性来修饰静态方法。例如:

1
2
3
4
5
6
7
8
9
10
11
[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页面中,您可以执行以下操作:

1
2
3
4
5
6
<form id="form1" runat="server">
   
       
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
   
</form>

并通过javascript调用服务器端方法,使用:

1
2
3
4
5
6
7
8
9
10
    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit:" + result);
    }

在启动长时间运行的任务之前,请检查客户端是否仍然连接:

1
2
3
4
if (this.Response.IsClientConnected)
{
  // long-running task
}

ASP.NET的一个鲜为人知且很少使用的功能是:

标签映射

它很少被使用,因为只有在特定的情况下你才需要它,但是当你需要它时,它是那么的方便。

关于这个鲜为人知的特性的一些文章:

ASP.NET中的标记映射在ASP.NET 2.0中使用标记映射

从上一篇文章:

Tag mapping allows you to swap
compatible controls at compile time on
every page in your web application. A
useful example is if you have a stock
ASP.NET control, such as a
DropDownList, and you want to replace
it with a customized control that is
derived from DropDownList. This could
be a control that has been customized
to provide more optimized caching of
lookup data. Instead of editing every
web form and replacing the built in
DropDownLists with your custom
version, you can have ASP.NET in
effect do it for you by modifying
web.config:

1
2
3
4
5
6
7
<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

  • 对于团队中的其他开发人员来说,这将非常令人困惑。
  • @Aykut——确实可以,这就是为什么我说它的实用性相当狭窄,但是,当需要时,它非常方便。此外,我还将确保标记映射的任何使用都非常清楚地记录下来,以避免任何混淆和歧义。


HTTPMODEL。这座建筑非常优雅。也许不是隐藏的功能,但仍然很酷。

  • httpmodules是一种高级的东西,但我不会称它为稀有或使用较少(或称我为幼稚)。但是,是的,我喜欢这个建筑。
  • +1因为很多经验丰富的开发人员可能知道httpmodules,但不完全理解它们与请求的关系。(与httphandlers相同)


代码表达式生成器

样本标记:

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

代码表达式生成器的真正优点是可以在非数据绑定情况下使用类似数据绑定的表达式。还可以创建执行其他函数的其他表达式生成器。

Web.CONFIG:

1
2
3
<system.web>    
    <compilation debug="true">
        <expressionBuilders>

使一切发生的CS类:

1
2
3
4
5
6
7
8
9
10
11
[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
}

  • 你对标题中的"和其他人"是什么意思?
  • 好吧,我想我从来没有接触过其他人。
  • +1,非常酷的功能…这实际上与WPF的标记扩展非常相似。
  • 这和使用<%= /*code*/ %>不一样吗?


可以在.aspx页内使用ASP.NET注释来注释包括服务器控件在内的整个页面部分。注释掉的内容将永远不会发送到客户机。

1
2
3
4
5
<%--
   
       
   
--%>

  • 有人谁真的不知道有意见吗?
  • 这是隐藏的特征?:O
  • 我喜欢它,当你的aspx页面有帮助!-评论…
  • 它是不是裸特征of ASP.NET


ashx文件类型的用法:
如果您只想输出一些基本的HTML或XML,而不需要经过页面事件处理程序,那么可以简单地实现httpmodule。

将页面命名为somehandlerpage.ashx,并在其中输入以下代码(仅一行)

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

然后是代码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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; }
        }
    }
}

  • 值得注意的是,如果需要,您应该添加IRequiressessionState或IReadonlysessionState,否则它将不存在。
  • 值得注意的是,您可以在web.config中指定处理程序的设置,这样就不需要有一个物理的ashx文件。或者可以在全局asax中以编程方式在应用程序中注册处理程序。


基于目标浏览器等设置服务器控件属性。

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

那个有点让我吃惊。

  • + 1。你能寄样品的短代码内联。我认为它会产生更多的注意力和upvotes。我想这一去。


system.web.virtualpathutility(系统.web.virtualpathutility)


我在一个ASP.NET应用程序上工作,该应用程序通过了一家领先的安全公司的安全审计,我学会了这个简单的技巧来防止一个不太知名但很重要的安全漏洞。

以下解释来自:http://www.guidanceshare.com/wiki/asp.net_2.0_安全指导原则_uuu参数_u操作考虑使用_page.viewstateUserkey_反击_一键单击攻击

考虑使用page.viewstateUserkey来反击一键攻击。如果您对调用者进行身份验证并使用viewstate,请在page_init事件处理程序中设置page.viewstateUserkey属性以防止一键攻击。

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

将属性设置为每个用户都知道的唯一值,例如会话ID、用户名或用户标识符。

当攻击者创建一个网页(.htm或.aspx),其中包含一个名为"viewstate"的隐藏表单字段,该字段已被viewstate数据填充时,就会发生一次单击攻击。可以从攻击者先前创建的页面(例如包含100个项目的购物车页面)生成viewstate。攻击者引诱一个毫无戒心的用户浏览页面,然后攻击者将页面发送到视图状态有效的服务器。服务器无法知道viewstate来自攻击者。viewstate验证和hmacs不应对这种攻击,因为viewstate是有效的,页面是在用户的安全上下文下执行的。

通过设置viewstateUserkey属性,当攻击者浏览到一个页面以创建viewstate时,该属性初始化为其名称。合法用户向服务器提交页面时,会使用攻击者的名称初始化页面。因此,VIEWSTATE HMAC检查失败,并生成异常。

  • 所以记得把base.oninit页;(e)为_ init()函数做它的工作。
  • 我认为这个把戏CAN故障如果A房用户不接受cookies,或如果安切洛蒂SessionID超时。
  • 你不需要base.OnInit(e);如果你使用的是AutoEventWireup="true"for the page。
  • 德鲁伊:He’s困境(在这案例,overriding OnInit base.oninit(e)是必要的)。
  • 使用会话ID和唯一的作品viewstateuserkey后安切洛蒂是会话开始。它也意味着页面超时后进行CAN会话到期。在的情况下在这些问题是一个问题,你可能会考虑使用更持久的东西,如用户的IP地址。
  • 在这种情况下,我们不能完全防止CSRF的攻击。"它不工作,支持非单调(IU GET请求),和它不工作,如果ViewState的MAC是把离湖。"cgisecurity.com / / viewstateuserke.html 2008-09年度,我们知道该假设和限制使用的是,如果你在为你的反CSRF的策略。


已启用httpContext.current.isDebugging

这对于确定要输出哪些脚本(最小版本或完整版本)或在开发人员中可能需要但不是实时的任何其他脚本都非常有用。

  • 如果只是使用#调试
  • 我同意一个月,但有时它可以有一个有趣的应用程序不知道它的执行状态的调试/释放。


面板中的DefaultButton属性。

它为特定面板设置默认按钮。

  • 注意,不适用于所有类型的按钮,例如LinkButtons!


包含在ASP.NET 3.5 SP1中:

  • 现在,customErrors支持值为"responserewrite"的"redirectMode"属性。显示错误页而不更改URL。
  • 表单标记现在识别action属性。非常适合使用URL重写

使用configSource拆分配置文件。

例如,可以使用web.config文件中的configSource属性将配置元素推送到其他.config文件中。而不是:

1
2
        <!-- some more keys -->
    </appSettings>

…您可以将整个appsettings部分存储在另一个配置文件中。这是新的web.config

1
 

myAppSettings.config文件:

1
2
        <!-- some more keys -->
    </appSettings>

这对于将应用程序部署到客户而不希望它们干扰web.config文件本身并且只希望它们能够更改一些设置的情况非常有用。

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

  • 这也适用于任何类型的.NET项目,例如桌面应用程序。组态


Scottgu在http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx上有很多技巧


page指令中的maintainScrollPositiononPostback属性。它用于在回发中保持ASPX页面的滚动位置。

  • 评论有助于改进答案。


httpContext.isCustomerRorEnabled是一个很酷的功能。我发现它不止一次有用。这是一篇短文。


默认情况下,自定义控件的标记之间的任何内容都将作为子控件添加。这可以在addParsedSubObject()重写中截获,用于筛选或附加分析(例如,LiteralControls中的文本内容):

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

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

如果有ASP.NET生成RSS提要,它有时会在页面顶部添加一行额外的内容。这不会用普通的RSS验证器进行验证。您可以通过将page指令<@Page>放在页面底部来解决这个问题。

  • 不会,你做的更好的使用.ashx处理程序生成的RSS供稿?
  • 我想这取决于项目的复杂性。每一个有需要的能力或技能的创建和编译处理程序。在本页使用ASP.NET的好作品
  • 你可以使用一些如生成RSS项目和做其他的技巧(如使用为了删除一些项目)是多个比写作字符串从ashx海事组织
  • linqtoxml + ashx是要走的路!
  • 这是有用的为更多比RSS饲料一代。这个HTML5必须有!doctype HTML标签在顶部第一行是正确的验证。


在ASP.NET v3.5添加路由之前,只需在页面管道的早期(如BeginRequest事件)中写入httpmodule并重写请求,就可以创建自己的友好URL。

像http://servername/page/param1/someparams1/param2/someparams2这样的URL将被映射到下面的另一个页面(通常使用正则表达式)。

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

dotnetnuke有一个非常好的httpmodule,它为其友好的URL执行此操作。对于无法部署.NET 3.5版的计算机仍然有用。

  • 这需要所有的IIS请求映射到ASP.NET
  • 或一个404错误处理程序。


我的团队经常把它当作黑客:

1
2
3
4
5
6
7
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();

它以字符串形式加载网页的响应。您也可以发送post参数。

当我们需要廉价和快速的服务时,我们使用它来代替ascx/ajax/webservices。基本上,它是跨服务器访问Web可用内容的快速方法。事实上,我们昨天刚刚将其命名为"Redneck Web服务"。

  • 你也知道System.net.WebClient类,对吧?
  • 好吧,到目前为止,我IT职业生涯的亮点是汉塞尔曼给出了一个被称为"贫民窟"的答案。甜美!


您知道可以在IIS或Visual Studio之外运行ASP.NET吗?

整个运行时被打包并准备在任何想要尝试的进程中托管。使用ApplicationHostHttpRuntimeHttpApplication类,您也可以研磨这些.aspx页面并从中获得闪亮的HTML输出。

1
2
3
HostingClass host = ApplicationHost.CreateApplicationHost(typeof(HostingClass),
                                           "/virtualpath","physicalPath");
host.ProcessPage(urlToAspxFile);

还有你的主持课:

1
2
3
4
5
6
7
8
9
10
11
12
public class HostingClass : MarshalByRefObject
{
    public void ProcessPage(string url)
    {
        using (StreamWriter sw = new StreamWriter("C:\temp.html"))
        {
            SimpleWorkerRequest worker = new SimpleWorkerRequest(url, null, sw);
            HttpRuntime.ProcessRequest(worker);
        }
                    // Ta-dah!  C:\temp.html has some html for you.
    }
}

compilationmode="never"是在某些ASP.NET站点中至关重要的功能。

如果您有一个ASP.NET应用程序,在该应用程序中,经常通过CMS或其他发布系统生成和更新ASPX页,则必须使用compilationMode="never"。

如果不使用此设置,ASPX文件更改将触发重新编译,这将快速使AppDomain重新启动。这可以清除会话状态和httpruntime缓存,更不用说重新编译导致的延迟。

(为了防止重新编译,您可以增加NumRecompilesForAppRestart设置,但这并不理想,因为它会消耗更多的内存。)

该特性的一个警告是,ASPX页不能包含任何代码块。为了解决这个问题,可以将代码放在自定义控件和/或基类中。

在ASPX页面不经常更改的情况下,此功能通常是不相关的。


vs阻塞的有效语法:

1
2
3
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
  <%# ((bool) Eval("InRole")) ?"checked" :"" %>
  <%# ViewData.Model.IsInRole("Admin") ?"" :"disabled" %> />


system.web.hostingenvironment.mappath(系统.web.hosting.hostingenvironment.mappath)


我想到了一个特点,有时候你需要把你的页面的一部分隐藏起来,不让乌鸦看到。您可以使用JavaScript或使用以下简单代码:

1
2
if (Request.Browser.Crawler){
        HideArticleComments();

  • 这并不总是有效的,因为一些爬虫欺骗正常的流量。
  • 这是非常糟糕的搜索引擎优化。如果你把东西藏起来不让爬行者看到,你将在排名中受到惩罚。这也是误导。


与optimizations="true"解决方案类似,这里还有一个解决方案可以加快您在构建之间等待的时间(非常好,尤其是在处理大型项目时):创建基于RAM的驱动器(即使用ramdisk),并将默认的"临时ASP.NET文件"更改为此基于内存的驱动器。

关于如何做到这一点的详细信息,请访问我的博客:http://www.wagnerdanda.me/2009/11/speeding-up-build-times-in-asp-net-with-ramdisk/

基本上,您首先配置一个ramdisk(同样,在我的博客中有一个指向免费ramdisk的链接),然后根据以下内容更改web.config:

1
2
3
4
5
6
7
 <system.web>
 ....
     <compilation debug="true" tempDirectory="R:\ASP_NET_TempFiles">
     ....
     </compilation>
 ....
 </system.web>

它大大增加了我的开发时间,你只需要为你的电脑投资内存:)

编程愉快!

瓦格纳丹达


Request.IsLocal属性:

它指示当前请求是否来自本地计算机。

1
2
3
4
5
6
7
8
if( Request.IsLocal )
{
   LoadLocalAdminMailSettings();
}
else
{
   LoadServerAdminMailSettings();
}

  • 在使用request.isLocal property forums.asp.net/t/1065813.aspx时,请在ASP.NET论坛上查看以下有关安全问题的讨论
  • 是的,最好避免这种情况并使用-if调试


当我将一个xmldocument()转储到一个标签中,并使用它的XSL转换显示时,我认为它很好。

  • Literal / placeholder会比A更合适的标签。


默认情况下,任何Web窗体页都继承自System.Web.UI.Page类。如果您希望您的页面从一个从System.Web.UI.Page继承的自定义基类继承,该怎么办?

有一种方法可以约束任何要从自己的基类继承的页。只需在您的web.config上添加一个新行:

1
2
3
<system.web>
    <pages pageBaseType="MyBasePageClass" />
</system.web>

注意:只有当您的类是独立类时,这才有效。我的意思是一个没有代码的类,它看起来像<%@ Page Language="C#" AutoEventWireup="true" %>


EnsureChildControls方法:检查子控件是否已启动。如果未启动子控件,则调用CreateChildControls方法。


将app_code文件夹中的类附加到全局应用程序类文件。

ASP.NET 2.0-global.asax-代码隐藏文件。

这也适用于Visual Studio 2008。


很多人都提到了在重新编译时如何优化代码。最近我发现我可以在ASPX页面中完成大部分的开发(代码隐藏),并完全跳过构建步骤。只需保存文件并刷新页面即可。您只需将代码包装在以下标记中:

1
2
3
4
5
<script runat="server">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     Response.Write("Look Ma', I didn't even had to build!")
   End Sub

一旦你完成了,只需把所有的代码转移到后面,构建,测试所有的工作,瞧!

-D

  • 如果使用网站项目而不是Web应用程序,则可以在代码隐藏中编写代码,ASP.NET将在后台为您编译代码。您不需要自己编译项目。
  • 大多数时候,有很多理由不这么做。
  • @布兰尼斯拉夫,是的,但是对于那些使用Web应用程序项目的人来说,这是一个解决方法。@乔尔,什么原因?为了清楚起见,我只在开发中使用这种方法,并且只在处理可能导致多次测试的代码片段时才使用这种方法。


可以使用其uniqueid属性查找任何控件:

1
Label label = (Label)Page.FindControl("UserControl1$Label1");

  • 真实身份是硬编码的,但独特的浴室为之改变。它是在运行时。
  • UniqueID是有用的设置形式的A /接受默认按钮。


页对象上的ClientScript属性。


web.config中appsettings元素的"file"属性。

指定包含自定义应用程序配置设置的外部文件的相对路径。

如果在许多需要在不同环境(prod)中修改的应用程序设置中,您只有很少的设置,那么这是一个很好的选择。

由于对web.config文件的任何更改都会导致应用程序重新启动,因此使用单独的文件,用户可以修改appsettings部分中的值,而不会导致应用程序重新启动。单独文件的内容与web.config文件中的appsettings部分合并。


如果使用Web服务而不是WCF服务,则仍可以使用标准的.NET成员身份来强制身份验证和登录会话行为。在一组Web服务上,类似于在不需要特殊会话的情况下,如何通过成员身份验证来保护网站和/或SOAP头实现,只需调用System.Web.Security.FormsAuthentication.SetAuthcookie(用户名,假)[调用后membership.validateuser(用户名、密码)当然可以]在响应中创建cookie,就像用户通过Web表单登录一样。然后可以使用response.cookies[].value检索此身份验证cookie,并将其作为字符串返回给用户通过在应用程序中重新创建cookie,通过提取cookie方法从request.inputstream调用param,并在成员身份以这种方式验证请求之前重新创建auth cookie成员资格提供程序会被欺骗,并且会知道请求是经过身份验证的,并强制执行其所有规则。

将此cookie返回给用户的Web方法签名示例如下:字符串登录(用户名、密码)

随后的Web方法调用示例如下:需要从request.inputstreamis中提取authcookie(从登录方法获得的值)参数的字符串dosomething(string authcookie、string methodparam1、int methodparam2等)

这还模拟登录会话,并在Web方法中调用FormsAuthentication.Signout,如此注销(Authcookie)将使用户需要重新登录。


应用程序变量可以与Web应用程序一起用于整个应用程序之间的通信。它在global.asax文件中初始化,并由独立于所创建会话的所有用户在该Web应用程序的页面上使用。


可以将ASPX页打包到库(.dll)中,并将其与ASP.NET引擎一起使用。

您需要实现自己的virtualpathprovider,它将通过特定于relfection的dll加载,或者您可以在路径名中包含dll名称。这取决于你。

当覆盖virtualfile.open方法时会发生这种魔力,在该方法中,您将ASPX文件作为来自程序集类:assembly.getManifestResourceStream的资源返回。ASP.NET引擎将处理该资源,因为它是通过virtualpathprovider提供服务的。

这允许插入页面,或者像我一样,使用它包含一个带有控件的httphandler。


模板化用户控件。一旦你知道它们是如何工作的,你就会看到各种各样的可能性。下面是最简单的实现:

模板控件.ascx

这里最棒的是使用简单而熟悉的用户控制构建块,并且能够使用HTML和一些占位符来布局UI的不同部分。

1
<%@ Control Language="C#" CodeFile="TemplatedControl.ascx.cs" Inherits="TemplatedControl" %>

模板控件.ascx.cs

这里的"秘密"是使用ITemplate类型的公共属性,并了解[ParseChildren][PersistenceMode]属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System.Web.UI;

[ParseChildren(true)]
public partial class TemplatedControl : System.Web.UI.UserControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Header { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Body { get; set; }

    void Page_Init()
    {
        if (Header != null)
            Header.InstantiateIn(HeaderPlaceHolder);

        if (Body != null)
            Body.InstantiateIn(BodyPlaceHolder);
    }
}

阿斯克斯

1
2
3
4
5
6
7
8
9
10
11
<%@ Register TagPrefix="uc" TagName="TemplatedControl" Src="TemplatedControl.ascx" %>

<uc:TemplatedControl runat="server">
    <Header>Lorem ipsum</Header>
    <Body>
        // You can add literal text, HTML and server controls to the templates
        <p>
Hello !
</p>
    </Body>
</uc:TemplatedControl>

您甚至可以获得内部模板属性的IntelliSense。因此,如果您在一个团队中工作,您可以快速创建可重用的UI,以实现与您的团队已经从内置的ASP.NET服务器控件中享受到的相同的可组合性。

msdn示例(与开头链接相同)添加了一些额外的控件和命名容器,但只有在您希望支持"转发器类型"控件时才需要这样做。


我在vb、vbscript和vb.net的多个版本中使用的方法之一是将记录集值转换为字符串,以消除对空或空的多重测试。即Trim(rsData("FieldName").Value &"")。如果是整数值,则为:CLng("0" & Trim(rsData("FieldName").Value &""))

  • 这对性能不利。另外,您不应该使用vb.net中的旧记录集。
  • 记录集/读卡器-相同事物不同名称
  • 在性能上没有明显的区别,除非你做了成千上万的工作。


在网站发布并部署到生产服务器之后,如果需要在服务器端按钮上做一些更改,请单击事件。我们可以使用ASPX页面本身的new关键字来覆盖现有的click事件。

例子

代码隐藏方法

1
2
3
4
 Protected void button_click(sender object, e System.EventArgs)
  {
     Response.Write("Look Ma', I Am code behind code!")  
  }

重写的方法:

1
2
3
4
5
6
7
<script runat="server">  
   Protected void new button_click(sender object, e System.EventArgs)
  {
     Response.Write("Look Ma', I am overrided method!")  
  }

</script

这样,我们就可以轻松地修复生产服务器错误,而无需重新部署。

  • 那不是过了一会儿就过时了吗?为什么正确地管理构建和部署过程并不更好?我最初的反应是,这不是一个"隐藏"的特性,而是对著名的new关键字的错误使用。
  • 我们有部署过程和检查来避免类似这样的远程操作,以及预编译任何ASP.NET任何东西…
  • 这不是隐藏的功能,这是肯定的!如果要在ASPX页中覆盖代码,那么使用代码隐藏有什么意义呢?只是为了避免重新部署?它破坏了整个"代码隐藏"概念:将代码与表示层分离。
  • 重新部署有什么大不了的?
  • 如果需要临时修复,这很好
  • 在生产服务器上开发…


这似乎是一个巨大的,模糊的问题…但是我会加入反射,因为它允许我做一些非常强大的事情,比如可插拔的DAL等等。

  • 反射当然不是ASP.NET隐藏功能…是的,这个问题应该是包罗万象的…
  • 我不确定你会用"隐藏特性"来定义什么。您可以考虑添加一个您认为是隐藏特性的示例。
  • 我的意思是,反射并不特定于ASP.NET。它甚至可以在ASP.NET之外使用(例如,在Win窗体应用程序中)