技术开发 频道

ASP.NET AJAX Beta 1 研究散记(1) ── ScriptModule

【IT168 技术文档】查看一下用ASP.NET AJAX-Enabled Web Site模板生成的网站文件里面的web.config,其中的pages部是这样的

<pages>
<controls>
<add tagPrefix="asp" namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Extensions, Version=1.0.61025.0,

Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add tagPrefix="asp" namespace="Microsoft.Web.UI.Controls" assembly="Microsoft.Web.Extensions, Version=1.0.61025.0,

Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
<tagMapping>
<add tagType="System.Web.UI.WebControls.CompareValidator"

mappedTagType="Microsoft.Web.UI.Compatibility.CompareValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>
<add tagType="System.Web.UI.WebControls.CustomValidator" mappedTagType="Microsoft.Web.UI.Compatibility.CustomValidator,

Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add tagType="System.Web.UI.WebControls.RangeValidator" mappedTagType="Microsoft.Web.UI.Compatibility.RangeValidator,

Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add tagType="System.Web.UI.WebControls.RegularExpressionValidator"

mappedTagType="Microsoft.Web.UI.Compatibility.RegularExpressionValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>
<add tagType="System.Web.UI.WebControls.RequiredFieldValidator"

mappedTagType="Microsoft.Web.UI.Compatibility.RequiredFieldValidator, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>
<add tagType="System.Web.UI.WebControls.ValidationSummary"

mappedTagType="Microsoft.Web.UI.Compatibility.ValidationSummary, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>
</tagMapping>
</pages>

    前面一部分把Microsoft.Web.Extensions里的控件的前缀设成asp,后面一部分则替换了原有的验证控件。

    httpHandlers/httpModules部是这样的,

<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="Microsoft.Web.Script.Services.ScriptHandlerFactory,

Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpHandlers>
<httpModules>
<add name="WebResourceCompression" type="Microsoft.Web.Handlers.WebResourceCompressionModule, Microsoft.Web.Extensions,

Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="ScriptModule" type="Microsoft.Web.UI.ScriptModule, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,

PublicKeyToken=31bf3856ad364e35"/>
</httpModules>

    前面一部分换掉了处理Web服务(*.asmx)的引擎,后面则在处理管道里添加 webresource.axd 资源压缩和脚本模块。脚本模块处理了3个事件,

protected virtual void Init(HttpApplication context)
{
context.PreSendRequestHeaders += new EventHandler(this.PreSendRequestHeadersHandler);
context.PostAcquireRequestState += new EventHandler(this.OnPostAcquireRequestState);
context.AuthenticateRequest += new EventHandler(this.AuthenticateRequestHandler);
}

 对PreSendRequestHeaders事件,处理重新定向,把重新定向的地址写到回复数据里

private void PreSendRequestHeadersHandler(object sender, EventArgs args)
{
HttpApplication application1 = (HttpApplication) sender;
if (PageRequestManager.IsAsyncPostBackRequest(application1.Request.Headers))
{
HttpResponse response1 = application1.Response;
if (response1.StatusCode == 0x12e)
{
string text1 = response1.RedirectLocation;
List<HttpCookie> list1 = new List<HttpCookie>(response1.Cookies.Count);
for (int num1 = 0; num1 < response1.Cookies.Count; num1++)
{
list1.Add(response1.Cookies[num1]);
}
response1.ClearContent();
response1.ClearHeaders();
for (int num2 = 0; num2 < list1.Count; num2++)
{
response1.AppendCookie(list1[num2]);
}
response1.Cache.SetCacheability(HttpCacheability.NoCache);
response1.ContentType = "text/plain"
response1.Write(PageRequestManager.EncodeString("pageRedirect", string.Empty, text1));
}
}
}

对AuthenticateRequest事件,设置了是否跳过授权

private void AuthenticateRequestHandler(object sender, EventArgs e)
{
HttpApplication application1 = sender as HttpApplication;
if ((application1 != null) && ScriptModule.ShouldSkipAuthorization(application1.Context))
{
application1.Context.SkipAuthorization = true;
}
}

 

对PostAcquireRequestState事件,则是用来调用页面的静态PageMethod的!

private void OnPostAcquireRequestState(object sender, EventArgs eventArgs)
{
HttpApplication application1 = (HttpApplication) sender;
HttpRequest request1 = application1.Context.Request;
if (RestHandler.IsPageMethodCall(request1))
{
WebServiceData data1 = WebServiceData.GetWebServiceData(HttpContext.Current, request1.FilePath, false, true);
string text1 = request1.PathInfo.Substring(4);
WebServiceMethodData data2 = data1.GetMethodData(text1);
RestHandler.ExecuteWebServiceCall(HttpContext.Current, data2);
application1.CompleteRequest();
}
}


0
相关文章