当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET的隐藏功能

如何解决《ASP.NET的隐藏功能》经验,为你挑选了42个好方法。

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


    
        
            
        
    

更好的是,将它放在你的dev box machine.config上,这样你就不必在你创建的每个应用程序上更改web.config. (32认同)

真?我正要安装一个虚假的SMTP服务器,比如Dumbster.我隐藏了宝石. (6认同)

有谁知道你是否可以为目录位置指定UNC共享? (2认同)


Troy DeMonbr.. 210

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

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

另外,正如marxidad所指出的,请确保文件中至少有512个字节的内容,以便IE6正确呈现它.



1> John Sheehan..:

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


    
        
            
        
    


更好的是,将它放在你的dev box machine.config上,这样你就不必在你创建的每个应用程序上更改web.config.
真?我正要安装一个虚假的SMTP服务器,比如Dumbster.我隐藏了宝石.
有谁知道你是否可以为目录位置指定UNC共享?

2> Troy DeMonbr..:

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

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

另外,正如marxidad所指出的,请确保文件中至少有512个字节的内容,以便IE6正确呈现它.


不要忘记IE的"友好"消息的解决方法:http://tinyurl.com/app-offline-friendly

3> John Sheehan..:
throw new HttpException(404, "Article not found");

这将被ASP.NET捕获,它将返回customErrors页面.在最近的.NET日报帖子中了解到这一点


纯粹是因为我现在知道了.NET提示网站.

4> Scott Hansel..:

这是最好的一个.将其添加到您的web.config中,以便更快地进行编译.这是通过此QFE发布的3.5SP1 .


快速摘要:我们在ASP.NET中引入了一个新的optimizeCompilations开关,可以在某些情况下大大提高编译速度.有一些捕获,所以请继续阅读更多细节.此交换机目前可作为3.5SP1的QFE使用,并将成为VS 2010的一部分.

ASP.NET编译系统采用了一种非常保守的方法,这种方法可以消除它在"顶级"文件发生变化时所做的任何先前的工作."顶级"文件包括bin和App_Code中的任何内容,以及global.asax.虽然这适用于小型应用程序,但它对于非常大的应用程序几乎无法使用.例如,客户遇到了一个案例,在对"bin"程序集进行任何更改后,需要花费10分钟来刷新页面.

为了减轻痛苦,我们添加了一个"优化的"编译模式,它采用了一种不那么保守的重新编译方法.

通过这里:


对于VS 2010,这是"默认启用"还是我还应该尝试一下?

5> Mark Cidade..:

HttpContext.Current将始终允许您访问当前上下文的Request/Response/etc.,即使您无法访问Page的属性(例如,来自松散耦合的帮助程序类).

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

如果你想要的只是一个编译的页面(或任何IHttpHandler),你不需要.ASPX文件.只需将路径和HTTP方法设置为指向web.config文件中元素中的类即可.

对象可以从被检索.ASPX文件编程通过调用PageParser.GetCompiledPageInstance(virtualPath,aspxFileName,上下文)


如果要将用户重定向到其他地址但仍有一些后端处理要做(例如,报表生成请求重定向到报表的生成状态页面,同时继续在后台生成报表)

6> Troy Hunt..:

machine.config级别的零售模式:


  
    
  

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



7> Binoj Antony..:

在内容页面中为MasterPages启用intellisense
我相信这是一个非常知名的黑客

大多数情况下,当你想使用它时,你必须使用findcontrol方法并从内容页面中转换主页面中的控件,MasterType 指令将在visual studio中启用intellisense

只需在页面中添加一个指令

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

如果您不想使用虚拟路径,请改用类名

<%@ MasterType TypeName="MyMainMasterPage" %>

在这里获取完整的文章


使用此功能可能会导致意外行为.请参阅http://stackoverflow.com/questions/1998931/how-to-fix-namespace-problem-with-autogenerated-master-property-if-mastertype-is

8> John Sheehan..:

HttpContext.Items作为请求级缓存工具


这也是我的观点,我在嵌套控件中使用它来传递/接收请求级别信息.Ii还在MVC中使用它来存储要附加的js文件列表,基于部分视图.

9> Radu094..:

有两件事在我脑海中脱颖而出:

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

#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页面(在你删除VS生成的.designer.cs和.cs代码隐藏之后):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     

您可以在ASPX中拥有未出现在Class1中的控件,反之亦然,但您需要记住检查控件是否为空.


是否有其他人认为允许您从网址激活跟踪存在安全风险?(#1)我不打算回答这个问题,但重要的是了解那里的风险.
绝对,您应该将该代码放在#ifdef DEBUG #endif块中
为什么从URL激活跟踪存在安全风险?怎么用来伤害我?

10> FlySwat..:

您可以使用:

 Request.Params[Control.UniqueId] 

要在初始化viewFate之前获取控件的值(此时Control.Text等将为空).

这对Init中的代码很有用.



11> Dan Diplo..:

的WebMethods.

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

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List GetFruitBeginingWith(string letter)
{
    List products = new List() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

现在,在ASPX页面中,您可以执行以下操作:

并使用以下命令通过JavaScript调用服务器端方法:

    



12> RickNZ..:

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

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



13> CraigTP..:

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

标记映射

它很少使用,因为只有你需要它的特定情况,但是当你需要它时,它是如此方便.

一些关于这个小知识的文章:

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

从上一篇文章:

标记映射允许您在编译时在Web应用程序的每个页面上交换兼容的控件.一个有用的示例是,如果您有一个库存ASP.NET控件,例如DropDownList,并且您希望将其替换为从DropDownList派生的自定义控件.这可以是一个定制的控件,以提供更优化的查找数据缓存.您可以通过修改web.config来实现ASP.NET,而不是编辑每个Web表单并使用您的自定义版本替换内置的DropDownLists:


 
   
   
  



14> Allain Lalon..:

HttpModules.这座建筑非常优雅.也许不是一个隐藏的功能,但也很酷.


HttpModules是先进的,但我不会称它为罕见或较少使用(或称我天真).但是,我喜欢这种建筑.

15> Chris Pietsc..:

您可以在.aspx页面中使用ASP.NET注释来注释掉包含服务器控件的页面的完整部分.注释掉的内容永远不会发送给客户端.

<%--
    
--%>


当你在有些人真的不知道有评论吗?

16> andleer..:

代码表达式构建器

样本标记:

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

代码表达式构建器的真正之处在于,您可以在非数据绑定情况下使用数据绑定表达式.您还可以创建执行其他功能的其他Expression Builders.

web.config中:

    
    
        
            

使这一切成为现实的cs类:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 


+1,非常酷的功能......这实际上与WPF的标记扩展非常相似

17> Binoj Antony..:

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


值得注意的是,如果需要,应该添加IRequiresSessionState或IReadOnlySessionState,否则它不会存在.
还值得注意的是,您可以在web.config中指定处理程序的设置,这样您就不需要放置物理ashx文件了.或者,您可以在全局asax中以编程方式在应用程序中注册处理程序.

18> Omer van Klo..:

设置基于目标浏览器服务器控件属性和更多.


那一点让我感到意外.



19> Chris Pietsc..:

System.Web.VirtualPathUtility



20> Craig McKeac..:

我在一个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,用户名或用户标识符.

当攻击者创建包含名为__VIEWSTATE且已填充ViewState数据的隐藏表单字段的网页(.htm或.aspx)时,会发生一键式攻击.可以从攻击者先前创建的页面生成ViewState,例如包含100个项目的购物车页面.攻击者诱使不知情的用户浏览该页面,然后攻击者将该页面发送到ViewState有效的服务器.服务器无法知道ViewState源自攻击者.ViewState验证和HMAC不会抵御此攻击,因为ViewState有效且页面在用户的安全上下文下执行.

通过设置ViewStateUserKey属性,当攻击者浏览到页面以创建ViewState时,该属性将初始化为他或她的名称.当合法用户将页面提交给服务器时,它将使用攻击者的名称进行初始化.因此,ViewState HMAC检查失败并生成异常.


还记得离开base.OnInit(e); 使Page_Init()函数完成其工作.

21> John Sheehan..:

HttpContext.Current.IsDebuggingEnabled

这非常适合确定要输出哪些脚本(最小版本或完整版本)或您在开发中可能需要的任何其他内容,但不能直播.



22> John Sheehan..:

包含在ASP.NET 3.5 SP1中:

customErrors现在支持"redirectMode"属性,其值为"ResponseRewrite".显示错误页面而不更改URL.

表单标记现在可识别操作属性.非常适合您使用URL重写时



23> MRG..:

Panels中的DefaultButton属性.

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



24> Mark Cidade..:

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



25> Ryan Shripat..:

使用configSource拆分配置文件.

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

    
        
        
    

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

    

myAppSettings.config文件中:

            
        
        
    

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

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



26> MRG..:

Page指令中的MaintainScrollPositionOnPostback属性.它用于在回发中维护aspx页面的滚动位置.



27> Kilhoffer..:

HttpContext.IsCustomErrorEnabled是一个很酷的功能.我发现它不止一次有用.这是一篇关于它的简短帖子.



28> Mark Cidade..:

默认情况下,自定义控件的标记之间的任何内容都将添加为子控件.这可以在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);
     }

...

   
     ...this text is parsed as a LiteralControl...
  



29> Kevin Goff..:

如果您有ASP.NET生成RSS源,它有时会在页面顶部添加一行.这不会使用常见的RSS验证器进行验证.您可以通过将页面指令放在页面<@Page>底部来解决它.


使用.ASHX处理程序生成RSS提要不是更好吗?

30> Tyler..:

在ASP.NET v3.5添加路由之前,您可以通过编写HTTPModule并在页面管道的早期重写请求(如BeginRequest事件)来创建自己的友好URL.

像http:// servername/page/Param1/SomeParams1/Param2/SomeParams2这样的网址会被映射到下面的另一个页面(通常使用正则表达式).

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

DotNetNuke有一个非常好的HttpModule,可以为他们友好的网址做到这一点.对于无法部署.NET v3.5的计算机仍然有用.



31> Graham..:

我的团队使用它作为黑客:

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 Web Service".


你也知道System.Net.WebClient类吧?

32> womp..:

您是否知道可以在IIS或Visual Studio之外运行ASP.Net?

整个运行时打包并准备好在任何想要尝试的过程中托管.使用ApplicationHost,HttpRuntime以及HttpApplication类,你也可以磨碎的.aspx页,并从他们那里得到闪亮的HTML输出.

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

和你的托管班:

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.
    }
}



33> frankadelic..:

CompilationMode ="Never"是一个在某些ASP.NET站点中至关重要的功能.

如果您有一个ASP.NET应用程序,其中ASPX页面经常通过CMS或其他发布系统生成和更新,则使用CompilationMode ="Never"非常重要.

如果没有此设置,ASPX文件更改将触发重新编译,这将很快使您的应用程序域重新启动.这可以消除会话状态和httpruntime缓存,更不用说重新编译引起的延迟了.

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

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

在ASPX页面不经常更改的情况下,此功能大多无关紧要.



34> leppie..:

VS chokes的有效语法:

 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />



35> John..:

System.Web.Hosting.HostingEnvironment.MapPath



36> Khaled Musai..:

我想到了一个功能,有时你需要隐藏页面的一些部分.你可以用javascript或使用这个简单的代码:

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


这并不总是有效,因为一些爬虫恶搞正常流量.

37> Wagner da Si..:

与optimizeCompilations ="true"解决方案类似,这里有另一个解决方案,可以加快您在构建之间等待的时间(非常好,特别是如果您正在处理大型项目): 创建基于ram的驱动器(即使用RamDisk)和将默认的"Temporary ASP.NET Files"更改为此基于内存的驱动器.

有关如何执行此操作的详细信息,请访问我的博客:http://www.wagnerdanda.me/2009/11/speeding-up-build-times-in-asp-net-with-ramdisk/

基本上你首先配置一个RamDisk(再次,在我的博客中有一个免费ramdisk的链接),然后根据这个改变你的web.config:

 
 ....
     
     ....
     
 ....
 

它大大增加了我的开发时间,你只需要为你的计算机投入内存:)

快乐编程!

瓦格纳丹达



38> Paulj..:

当我将xmlDocument()转储到标签中并使用它的xsl转换显示时,我认为它很整洁.


文字/占位符比标签更合适......

39> MRG..:

Request.IsLocal属性:

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

if( Request.IsLocal )
{
   LoadLocalAdminMailSettings();
}
else
{
   LoadServerAdminMailSettings();
}


在使用Request.IsLocal属性http://forums.asp.net/t/1065813.aspx时,请在asp.net论坛上查看以下有关安全问题的讨论.

40> roland..:

默认情况下,任何Web表单页面都继承自System.Web.UI.Page类.如果您希望页面继承自继承自定义基类的内容,该System.Web.UI.Page怎么办?

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


    

注意:这仅在您的课程是独立课程时才有效.我的意思是一个没有代码隐藏的类,看起来像<%@ Page Language="C#" AutoEventWireup="true" %>



41> cllpse..:

将位于App_Code文件夹中的类附加到Global Application Class文件.

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

这也适用于Visual Studio 2008.



42> Canavar..:

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

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有