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

Page 1 of 2 12 LastLast
  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
  7. #7
    Hi

    I was talking about that :

    The following sets up the AJAX timeout golbally:
    Ext.Ajax.timeout = 120000;
    Ext.net.DirectEvent.timeout = 120000;
    You can just place that code into a page <head>.
    And an example of that :
    You can just place that code into a page <head>.
    Because it was the solution I tried and I was not able to make it works

    ANd another thing, how to setup a sleep in place of an infinite loop, because, sleep function is linked to threads but threads are not implemented by default.
  8. #8
    Hello @feanor91!

    Could you put a clear example on how to setup at global level please? Perhaps I may have not configure it corectly.
    As for this part, I hope you are ok with globally setting the timeout... right?

    As for the last inquiry:

    I was talking about that :
    The following sets up the AJAX timeout golbally:
    Ext.Ajax.timeout = 120000;
    Ext.net.DirectEvent.timeout = 120000;
    You can just place that code into a page <head>.
    You're not talking about global anymore. This will be setting it on the page where the code is run. Well, you can call this on a Master Page or Layout Page, of course, still, not "global" as in Web.config or Session/Application variable as already covered.

    But alas, you got a point there!.. This does not work in current Ext.NET version. Sencha has changed the code, I believe between ExtJS 6.0.2 to 6.2.1, where I've been noticing several config/properties have been renamed from (for example) timeout to _timeout to point they are private.

    And it happens Ext.Ajax.timeout is just another of these.

    General rule of thumb to changing properties at run-time in ExtJS is calling their corresponding setter... Too bad, ExtJS 6.2.1 docs on Ext.Ajax are broken and we can not benefit very much from it, but at least for what counts as usage examples, we can see there. Fortunately they fixed for 6.5.0, so here it is: Ext.Ajax class for ExtJS 6.5.0. It didn't change very much.

    So, then, instead of trying to set timeout directly, you should use the setter. Ext.NET's DirectEvent would probably work the same.

    Enough theory? Here's the code you provided, now reviewed using the JavaScript approach you requested last, correctly issuing the setters.

    <%@ 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()
        {
            System.Threading.Thread.Sleep(35000); //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 + "%");
            };
    
            Ext.Ajax.setTimeout(40000);
            Ext.net.DirectEvent.setTimeout(40000);
        </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">
                                <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>
    I have trimmed it for the necessary minimum to ensure it is working. Notice, if you comment out lines 78-79 (or any of them) you'll get the timeout error message, as the default value is 30000ms (30s).

    And also, there's the sleep you asked about. You mentioned threads are not implemented by default in code behind, but in a sense, no matter what, code behind is always running in threads fired by IIS worker processes which, in turn, are threads of the IIS server so, whenever we're talking about code behind, a delay with System.Threading.Thread.Sleep() should work. Anyway, that goes beyond Ext.NET scope, just seems a nice way to simulate long running operations that we actually use in our Examples Explorers. So, at least in that context, seems it works well.

    Hope this helps and clarifies your questions!
    Fabrício Murta
    Developer & Support Expert
  9. #9
    Hi

    Yes, it clarify a lot, thnks, and in particular the fact I was not able to make it working in the head part.

    Meanwhile it doesn't answer the very first question : why, by setting the timeout ine the proxy definition like oher direct method call, it doesn't work?

    Sorry but I'm curious :)
  10. #10
    Hello @feanor91!

    As per why the timeout does not work in proxy definition, you caught me! Now that you asked, I have looked better at it and it seems that the short answer is that is simply does not work.

    An in-depth investigation needs to take place still, but I don't see references for it from Sencha documentation on proxy, even enabling it to show inherited config options.

    As we're talking about direct methods/events I was thinking there might be something implemented at some point specific to Ext.NET but I see no references for timeout in our overrides either.

    I just checked here and it does not work even if I set a value behind the default 30 seconds limit. We'll have to give it a better look. A probably reason is it has been left over from version upgrades and we didn't notice the timeout moved somewhere else.
    Fabrício Murta
    Developer & Support Expert
Page 1 of 2 12 LastLast

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