Несовместимое поведение LinkButton PageMethod в разных браузерах

У меня есть LinkButton на странице, которая выполняет постбэк, но также имеетonClientClick мероприятие. Идея состоит в том, чтобы установить некоторые переменные сеанса в фоновом режиме из данных на стороне клиента (не спрашивайте).

Я поместил точку останова в веб-методе, чтобы пройти через наш код, и мы испытываем то, что в зависимости от браузера PageMethods может возвращать сообщение об успешном завершении, сообщение об ошибке илинет сообщений вообще, Кроме того, веб-метод может вызываться или не вызываться независимо от результата PageMethods.

Вот небольшая удобная диаграмма наших результатов:

Browser          PageMethods    WebMethod
--------------   -------------  --------------------
IE 8, 9, 10      Success        Called successfully
Safari 5.1.7     Failure        *Never called*
Firefox 25.0.1   *Neither*      Called successfully
Chrome v31       Failure        Called successfully

Это четыре разных браузера и четыре разных результата.

Я попытался сгенерировать кнопку ссылки в коде на стороне сервера и на стороне клиента с одинаковым эффектом и даже без установки переменных сеанса в WebMethod с одинаковыми результатами.

Код может быть воспроизведен с помощью следующего простого кода:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript">

    function doStuff() {
        var a = 'a';
        var b = 'b';

        PageMethods.doStuffWebMethod(a, b, doStuffSuccess, doStuffFail);
    }

    function doStuffSuccess() {
        alert(Success!');
    }
    function doStuffFail() {
        alert(Failure!');
    }

</script>

<html>
    <body style="background-color:#f3f4f6;" >

        <form runat="server" name="mainForm" id="mainForm" action="Test.aspx">

            <asp:ScriptManager ID="ScriptManager1"  EnablePageMethods="true" runat="server"></asp:ScriptManager>

            <asp:LinkButton runat="server" CausesValidation="false" OnClientClick="doStuff();">Do stuff!</asp:LinkButton>

        </form>
    </body>
</html>

а также

protected void Page_Load(object sender, EventArgs e)
{
    LinkButton lbAdd = new LinkButton();
    lbAdd.Text = "Web method test";
    lbAdd.CausesValidation = false;
    lbAdd.OnClientClick = "doStuff();";
    mainForm.Controls.Add(lbAdd);
}

[WebMethod]
public static void doStuffWebMethod(string a, string b)
{
    try
    {
        //System.Web.HttpContext.Current.Session["a"] = a;
        //System.Web.HttpContext.Current.Session["b"] = b;
        string x = a + b;
    }
    catch (Exception ex)
    {
        //
    }
}

Вопрос:

Почему мой веб-метод не работает в Safari и дает мне одно из трех разных сообщений возврата в трех других браузерах?

Как я могу изменить этот код, чтобы он работал в упомянутых браузерах?

Ответы на вопрос(1)

Ваш ответ на вопрос