フォーム上のアクションを書き換えるために構築されたカスタム コントロール アダプターを持つ Web サイトがあります。(これは別の機関から継承したサイトです) デバッグ モードで localhost を実行すると、すべてがうまく機能します。しかし、QA 環境でサイトをサーバーに公開するとすぐに、カスタム アダプターの起動が停止します。
デバッグ シンボルを公開し、w3wp プロセスにアタッチしました。ページ ロード プロセスをステップ実行しても、カスタム コントロール アダプターに設定されたブレークポイントがヒットすることはありません。localhost でデバッグを実行すると、ページが読み込まれるたびに起動します。本番コードは同じサーバー上で実行され、本番環境のカスタム コントロール アダプターは機能しています。しかし、本番環境を更新する必要があり、本番サイトが壊れてしまうのではないかと心配しています。
カスタム コントロール アダプターがサーバー上で起動しない理由を知っている人はいますか? これまでカスタム アダプターを使用したことがありません。アダプターを App_Code フォルダーに配置し、.browser ファイルのエントリを App_Browser フォルダーに配置する以外に何かする必要がありますか?
App_Code フォルダー内のアダプター コード:
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter {
protected override void Render(System.Web.UI.HtmlTextWriter writer) {
base.Render(new RewriteFormHtmlTextWriter(writer));
}
}
public class RewriteFormHtmlTextWriter : HtmlTextWriter {
public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
: base(writer) {
InnerWriter = writer.InnerWriter;
}
public RewriteFormHtmlTextWriter(TextWriter writer)
: base(writer) {
InnerWriter = writer;
}
public override void WriteAttribute(string name, string value, bool fEncode) {
// if the attribute we are writing is the "action" attribute, and we are not on a sub-control,
// then replace the value to write with the raw URL of the request - which ensures that we//ll
// preserve the PathInfo value on postback scenarios
if (name == "action") {
HttpContext Context = HttpContext.Current;
if (Context.Items["ActionAlreadyWritten"] == null) {
// Because we are using the UrlRewriting.net HttpModule, we will use the
// Request.RawUrl property within ASP.NET to retrieve the origional URL
// before it was re-written. You//ll want to change the line of code below
// if you use a different URL rewriting implementation.
value = Context.Request.RawUrl;
// Indicate that we//ve already rewritten the <form>//s action attribute to prevent
// us from rewriting a sub-control under the <form> control
Context.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
そして、App_Browser フォルダーにある私の .browser ファイル:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
<!--<adapter controlType="System.Web.UI.HtmlControls.HtmlLink" adapterType="LinkRewriterControlAdapter" />-->
</controlAdapters>
</browser>
</browsers>