この質問は歴史的に重要であるために存在しますが、このサイトではトピックに適した質問とは見なされないため、ここで同様の質問をすることができるという証拠として使用しないでください。
フリンジシナリオで役立つ機能は常に存在しますが、そのため、ほとんどの人はそれらを知りません。教科書では通常教えられない機能を求めています。
あなたが知っているものは何ですか?
この質問は歴史的に重要であるために存在しますが、このサイトではトピックに適した質問とは見なされないため、ここで同様の質問をすることができるという証拠として使用しないでください。
フリンジシナリオで役立つ機能は常に存在しますが、そのため、ほとんどの人はそれらを知りません。教科書では通常教えられない機能を求めています。
あなたが知っているものは何ですか?
回答:
テスト中は、SMTPサーバーではなく、コンピューター上のフォルダーにメールを送信できます。これをあなたのweb.configに入れてください:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
</smtp>
</mailSettings>
</system.net>
app_offline.htmという名前のファイルを Webアプリケーションディレクトリのルートに配置すると、ASP.NET 2.0+はアプリケーションをシャットダウンし、そのアプリケーションの新しい着信要求の通常の処理を停止し、app_offline.htmのコンテンツのみを表示します。すべての新しいリクエストのファイル。
これは、変更を本番サーバーに再デプロイ(またはロールバック)するときに「サイトが一時的に使用不可」の通知を表示する最も簡単な方法です。
また、marxidadによって指摘されているように、IE6が正しくレンダリングできるように、ファイル内に少なくとも512バイトのコンテンツがあることを確認してください。
throw new HttpException(404, "Article not found");
これは、customErrorsページを返すASP.NETによってキャッチされます。最近の.NET Tip of the Day Postでこれについて学びました
これが一番いいです。これを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は、ページのプロパティにアクセスできない場合(疎結合ヘルパークラスなど)でも、常に現在のコンテキストの要求/応答などにアクセスできます。
Response.Redirect(url、 false )を呼び出して、ユーザーを別のページにリダイレクトした後、同じページでコードの実行を続けることができます。
コンパイルしたページ(またはIHttpHandler)だけが必要な場合は、.ASPXファイルは必要ありません。パスとHTTPメソッドを設定して、web.configファイルの要素のクラスを指すだけです。<httpHandlers>
A ページ・オブジェクトから取得することができるの.aspx呼び出すことにより、プログラムファイルPageParser.GetCompiledPageInstance(virtualPath、aspxFileName、コンテキスト)
machine.configレベルのリテールモード:
<configuration>
<system.web>
<deployment retail="true"/>
</system.web>
</configuration>
web.config設定をオーバーライドして、デバッグをfalseに強制し、カスタムエラーをオンにして、トレースを無効にします。公開する前に属性を変更することを忘れないでください。それらすべてを開発またはテスト環境用に構成したままにして、製品の小売設定を更新してください。
コンテンツページでMasterPagesのインテリセンスを有効にする
これはほとんど知られていないハックだと思います
ほとんどの場合、findcontrolメソッドを使用し、使用するときにコンテンツページからマスターページのコントロールをキャストする必要があります。これを行うと、MasterType ディレクティブによってVisual Studioでインテリセンスが有効になります
ページにもう1つのディレクティブを追加するだけです
<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>
仮想パスを使用せず、代わりにクラス名を使用する場合
<%@ MasterType TypeName="MyMainMasterPage" %>
記事全文はこちら
要求レベルのキャッシュツールとしてのHttpContext.Items
私の頭の中で2つのことが際立っています。
1)コードからトレースをオンまたはオフにできます。
#ifdef DEBUG
if (Context.Request.QueryString["DoTrace"] == "true")
{
Trace.IsEnabled = true;
Trace.Write("Application:TraceStarted");
}
#endif
2)1つの共有「分離コード」ファイルのみを使用して、複数の.aspxページを構築できます。
1つのクラス.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]
コントロールの値を取得する前に、ビューステートが初期化されます(この時点では、Control.Textなどは空になります)。
これはInitのコードに役立ちます。
WebMethods。
ASPXページに配置されたWebメソッドへのASP.NET AJAXコールバックを使用できます。[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 2.0のタグマッピングを使用したASP.NETの
タグマッピング
そしてその最後の記事から:
タグマッピングにより、Webアプリケーションのすべてのページでコンパイル時に互換性のあるコントロールを交換できます。便利な例は、DropDownListなどの標準のASP.NETコントロールがあり、それをDropDownListから派生したカスタマイズされたコントロールに置き換える場合です。これは、ルックアップデータのキャッシュをより最適化するためにカスタマイズされたコントロールである可能性があります。すべてのWebフォームを編集して、組み込みのDropDownListsをカスタムバージョンで置き換える代わりに、web.configを変更することにより、ASP.NETで効果的に行うことができます。
<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という名前を付け、以下のコード(1行だけ)を挿入します
<%@ 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アプリケーションに取り組み、あまり知られていないが重要なセキュリティの脆弱性を防ぐための簡単なトリックを学びました。
以下の説明は、次のとおりです 。
Page.ViewStateUserKeyを使用してワンクリック攻撃に対抗することを検討してください。呼び出し元を認証し、ViewStateを使用する場合は、Page_InitイベントハンドラーでPage.ViewStateUserKeyプロパティを設定して、ワンクリック攻撃を防止します。
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}
プロパティを、セッションID、ユーザー名、ユーザー識別子など、各ユーザーに固有であることがわかっている値に設定します。
ワンクリック攻撃は、攻撃者が、既にViewStateデータが入力されている__VIEWSTATEという名前の非表示フォームフィールドを含むWebページ(.htmまたは.aspx)を作成すると発生します。ViewStateは、100アイテムのショッピングカートページなど、攻撃者が以前に作成したページから生成できます。攻撃者は、疑いを持たないユーザーをそのページの閲覧に誘い、ViewStateが有効なサーバーにページを送信させます。サーバーは、ViewStateが攻撃者から発信されたことを知る方法がありません。ViewStateは有効であり、ページはユーザーのセキュリティコンテキストで実行されるため、ViewState検証とHMACはこの攻撃に対抗しません。
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
PageディレクティブのMaintainScrollPositionOnPostback属性。ポストバック全体でaspxページのスクロール位置を維持するために使用されます。
デフォルトでは、カスタムコントロールのタグ間のコンテンツはすべて子コントロールとして追加されます。これは、フィルタリングまたは追加の解析(例:LiteralControlsのテキストコンテンツ)のAddParsedSubObject()オーバーライドでインターセプトできます。
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フィードを生成している場合、ページの上部に1行追加されることがあります。これは一般的なRSSバリデーターでは検証されません。ページ<@Page>
の下部にpageディレクティブを配置することで、この問題を回避できます。
ASP.NET v3.5がルートを追加する前は、HTTPModuleを書き込んでページパイプラインの早い段階でリクエストを書き直すだけで、独自のわかりやすいURLを作成できました(BeginRequestイベントなど)。
以下のようなURL のhttp://サーバー名/ページ/ Param1を/ SomeParams1 / PARAM2 / SomeParams2(多くの場合、正規表現を使用して)以下のように別のページにマッピングさになるだろう。
HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");
DotNetNukeには、友好的なURLに対してこれを実行する非常に優れたHttpModuleがあります。.NET v3.5をデプロイできないマシンでも引き続き役立ちます。