[OPEN] [#1483] [4.2.1]Timeout problem with page proxy

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1

    [OPEN] [#1483] [4.2.1]Timeout problem with page proxy

    Hello

    I use a page proxy to refresh a store. This refresh takes time, so I add a timeout to the proxy as I do for every others proxy or direct method calls, but it does'nt work, the timeout by default occurs after 30 seconds.

    Here an example taken from your vault, I just add the timeout and an infinite loop in the databind method to force the timeout.

    Timeout times are taken from debug windows into Chrome.

    <%@ Page Language="C#" %>
    
    <script runat="server">
        /// <summary>
        /// Possible arguments:
        ///     - string action
        ///     - string action, Dictionary<string, object> extraParams
        ///     - string action, Dictionary<string, object> extraParams, object serviceParams
        /// </summary>
        /// <returns></returns>
        [DirectMethod]
        public static object BindData()
        {
            while (true) ; //To generate timeout
            return Data;
        }
    
        private static object[] Data
        {
            get
            {
                DateTime now = DateTime.Now;
    
                return new object[]
                {
                    new object[] { "3m Co", 71.72, 0.02, 0.03, now },
                    new object[] { "Alcoa Inc", 29.01, 0.42, 1.47, now },
                    new object[] { "Altria Group Inc", 83.81, 0.28, 0.34, now },
                    new object[] { "American Express Company", 52.55, 0.01, 0.02, now },
                    new object[] { "American International Group, Inc.", 64.13, 0.31, 0.49, now },
                    new object[] { "AT&T Inc.", 31.61, -0.48, -1.54, now },
                    new object[] { "Boeing Co.", 75.43, 0.53, 0.71, now },
                    new object[] { "Caterpillar Inc.", 67.27, 0.92, 1.39, now },
                    new object[] { "Citigroup, Inc.", 49.37, 0.02, 0.04, now },
                    new object[] { "E.I. du Pont de Nemours and Company", 40.48, 0.51, 1.28, now },
                    new object[] { "Exxon Mobil Corp", 68.1, -0.43, -0.64, now },
                    new object[] { "General Electric Company", 34.14, -0.08, -0.23, now },
                    new object[] { "General Motors Corporation", 30.27, 1.09, 3.74, now },
                    new object[] { "Hewlett-Packard Co.", 36.53, -0.03, -0.08, now },
                    new object[] { "Honeywell Intl Inc", 38.77, 0.05, 0.13, now },
                    new object[] { "Intel Corporation", 19.88, 0.31, 1.58, now },
                    new object[] { "International Business Machines", 81.41, 0.44, 0.54, now },
                    new object[] { "Johnson & Johnson", 64.72, 0.06, 0.09, now },
                    new object[] { "JP Morgan & Chase & Co", 45.73, 0.07, 0.15, now },
                    new object[] { "McDonald\"s Corporation", 36.76, 0.86, 2.40, now },
                    new object[] { "Merck & Co., Inc.", 40.96, 0.41, 1.01, now },
                    new object[] { "Microsoft Corporation", 25.84, 0.14, 0.54, now },
                    new object[] { "Pfizer Inc", 27.96, 0.4, 1.45, now },
                    new object[] { "The Coca-Cola Company", 45.07, 0.26, 0.58, now },
                    new object[] { "The Home Depot, Inc.", 34.64, 0.35, 1.02, now },
                    new object[] { "The Procter & Gamble Company", 61.91, 0.01, 0.02, now },
                    new object[] { "United Technologies Corporation", 63.26, 0.55, 0.88, now },
                    new object[] { "Verizon Communications", 35.57, 0.39, 1.11, now },
                    new object[] { "Wal-Mart Stores, Inc.", 45.45, 0.73, 1.63, now }
                };
            }
        }
    </script>
    
    <!DOCTYPE html>
    
    <html>
    <head runat="server">
        <title>PageProxy with DirectMethod - Ext.NET Examples</title>
        <link href="/resources/css/examples.css" rel="stylesheet" />
    
        <script>
            var template = '<span style="color:{0};">{1}</span>';
    
            var change = function (value) {
                return Ext.String.format(template, (value > 0) ? "green" : "red", value);
            };
    
            var pctChange = function (value) {
                return Ext.String.format(template, (value > 0) ? "green" : "red", value + "%");
            };
        </script>
    </head>
    <body>
        <form runat="server">
            <ext:ResourceManager runat="server" />
    
            <h1>PageProxy with DirectMethod</h1>
    
            <ext:GridPanel
                ID="GridPanel1"
                runat="server"
                Title="Array Grid"
                Width="700"
                Height="310">
                <Store>
                    <ext:Store ID="Store1" runat="server">
                        <Model>
                            <ext:Model runat="server">
                                <Fields>
                                    <ext:ModelField Name="company" />
                                    <ext:ModelField Name="price" Type="Float" />
                                    <ext:ModelField Name="change" Type="Float" />
                                    <ext:ModelField Name="pctChange" Type="Float" />
                                    <ext:ModelField Name="lastChange" Type="Date" />
                                </Fields>
                            </ext:Model>
                        </Model>
                        <Proxy>
                            <ext:PageProxy DirectFn="App.direct.BindData" Timeout="3000000">
                                <Reader>
                                    <ext:ArrayReader />
                                </Reader>
                            </ext:PageProxy>
                        </Proxy>
                    </ext:Store>
                </Store>
                <ColumnModel runat="server">
                    <Columns>
                        <ext:RowNumbererColumn runat="server" Width="35" />
                        <ext:Column runat="server" Text="Company" DataIndex="company" Flex="1" />
                        <ext:Column runat="server" Text="Price" Width="75" DataIndex="price">
                            <Renderer Format="UsMoney" />
                        </ext:Column>
                        <ext:Column runat="server" Text="Change" Width="75" DataIndex="change">
                            <Renderer Fn="change" />
                        </ext:Column>
                        <ext:Column runat="server" Text="Change" Width="75" DataIndex="pctChange">
                            <Renderer Fn="pctChange" />
                        </ext:Column>
                        <ext:DateColumn runat="server" Text="Last Updated" Width="85" DataIndex="lastChange" Format="H:mm:ss" />
                    </Columns>
                </ColumnModel>
            </ext:GridPanel>
        </form>
    </body>
    </html>
  2. #2
    Hello @feanor91!

    I believe this is just a matter of setting the AJAX timeout setting. Please, check out these forum threads covering the issue, I'm pretty confident this is what you need:
    - Globally increase Ajax timeout for DirectMethod calls?
    - Change the timeout globally.

    Hope this helps! In short it involves setting resource manager's AJAX and/or DirectEvent timeout variables.
    Fabrício Murta
    Developer & Support Expert
  3. #3
    Very sorry but I already tried to apply timeout at a global level and it did not work. I think there is really a problem with page proxy.
  4. #4
    Hello @feanor91!

    Please change the infinite loop in your line 14 to a sleep. We can't leave it waiting your test case indefinitely.

    I have tried setting this for 240s (240000ms) wait in the code behind code and also setting ResourceManager's AjaxTimeout to 300000, and it worked fine here.

    But if you want the code behind to wait, say, 1 hour or more, you may be triggering internal IIS thresholds that are killing the thread. That would be beyond any Ext.NET means to wait the process to finish. In cases you need to let it run for arbitrary time, you should do it via assynchronous tasks.

    I'd say a web task more than 5 minutes long is inconceivable (should be put into a background task that the user can check whether it is done or not before fetching results). I'm not sure the IIS limits on waiting a worker thread to finish, but I am pretty confident that something more than 10 minutes long will get killed by the web server itself. Unless called in a separate and safe thread task, liberating the server worker thread to reply to further client requests.
    Fabrício Murta
    Developer & Support Expert
  5. #5
    Hi

    The infinite loop was just an easy wait to generate the timeout.

    Anyway, It works with AjaxTimeout into Ressource manager, I just tried to setup at global level and this one was not working for me.

    Could you put a clear example on how to setup at global level please? Perhaps I may have not configure it corectly.
  6. #6
    Hello @feanor91!

    Sorry, I really don't see a clearer way to explain it than the forum threads I pointed you.

    If anything, I can point you to the specific forum thread and the path there: Change the timeout globally, its last post points to the 5th post at Globally increase Ajax timeout for DirectMethod calls?.

    And take the answer here (just copied and pasted) for convenience:

    below text from the link for the 5th post just mentioned
    ResourceManager
    <ext:ResourceManager runat="server" AjaxTimeout="120000" />
    Web.config
    <extnet ajaxTimeout="120000" />
    It is also possible to set up via Application or Session global objects.
    Application["Ext.Net.AjaxTimeout"] = 120000;
    So, if you use a master page or a layout (MVC) with ResourceManager, you can set that parameter to Resource Manager and limit the setting for all pages using them.

    If you want the setting no matter what, everywhere on the application, then Web.config is for you.

    If you prefer this for session, during its creation and being able to change when the session changes (a user log in, for example), then you can use the Application/Session global objects.

    I hope this helps and clarifies the places you can use it.
    Fabrício Murta
    Developer & Support Expert

Similar Threads

  1. Replies: 1
    Last Post: Feb 22, 2017, 11:55 AM
  2. Replies: 0
    Last Post: Nov 22, 2016, 9:03 AM
  3. Replies: 0
    Last Post: Jun 01, 2016, 6:32 AM
  4. What exactly is Page Proxy?
    By chearner in forum 1.x Help
    Replies: 5
    Last Post: Jan 09, 2012, 9:52 PM
  5. Replies: 3
    Last Post: Sep 13, 2010, 8:39 AM

Posting Permissions