I had this problem some time ago, and I think I resolved it.
In BeginRequest (Global.asax or in an HttpHandler).....
HttpRequest request = HttpContext.Current.Request;
if (request.Headers["X-MicrosoftAjax"] == null && request.Form["__MicrosoftAjax"] != null)
{
request.Headers.GetType().InvokeMember("MakeReadWrite", System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, request.Headers, null);
request.Headers.Add("X-MicrosoftAjax", request.Form["__MicrosoftAjax"]);
request.Headers.GetType().InvokeMember("MakeReadOnly", System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, request.Headers, null);
}and on the page with the UpdatePanel...
<script type="text/javascript>
function beginRequest(sender, args) {
var r=args.get_request();
if (r.get_headers()["X-MicrosoftAjax"])
{
b=r.get_body();
var a="__MicrosoftAjax=" + encodeURIComponent(r.get_headers()["X-MicrosoftAjax"]);
if (b!=null && b.length>0)
{
b+="&";
}
else
b="";
r.set_body(b+a);
}
}
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
</script type="text/javascript>The idea is to intercept the async postback on the client and copy the value from the X-header into the regular POST data. On the server the request is also intercepted and if the post field is present and the header is not (indicating that it was removed by a firewall) , we add the header to the request. Since the headers collection is read-only some reflection magic is needed to open it up.