{"id":169440,"date":"2007-04-30T10:45:25","date_gmt":"2007-04-30T10:45:25","guid":{"rendered":"https:\/\/www.microsoft.com\/en-us\/research\/project\/ajax-view\/"},"modified":"2019-08-19T09:56:30","modified_gmt":"2019-08-19T16:56:30","slug":"ajax-view","status":"publish","type":"msr-project","link":"https:\/\/www.microsoft.com\/en-us\/research\/project\/ajax-view\/","title":{"rendered":"Ajax View"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajax-view-2.png\" alt=\"\" width=\"221\" height=\"122\" \/>Ajax View enables developer to see and control the behaviors of their web applications on user&#8217;s desktops.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>News<\/h2>\n<p><strong>April 29, 2009:<\/strong> The technology in Ajax View is now available as a Power Tool: <a class=\"msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall\" rel=\"noopener noreferrer\" target=\"_blank\" href=\"http:\/\/code.msdn.microsoft.com\/\/ajaxview\">Microsoft Visual Studio AJAX Profiling Extensions<span class=\"sr-only\"> (opens in new tab)<\/span><\/a>. This power tool includes a server-side extension to IIS to add profiling code to your JavaScript web applications, and a Visual Studio add-in to investigate this data with Visual Studio&#8217;s Performance Explorer.<\/p>\n\t<div data-wp-context='{\"items\":[]}' data-wp-interactive=\"msr\/accordion\">\n\t\t\t\t\t<div class=\"clearfix\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"btn-group align-items-center mb-g float-sm-right\"\n\t\t\t\t\tdata-bi-aN=\"accordion-collapse-controls\"\n\t\t\t\t>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn btn-link m-0\"\n\t\t\t\t\t\tdata-bi-cN=\"Expand all\"\n\t\t\t\t\t\tdata-wp-bind--aria-controls=\"state.ariaControls\"\n\t\t\t\t\t\tdata-wp-bind--aria-expanded=\"state.ariaExpanded\"\n\t\t\t\t\t\tdata-wp-bind--disabled=\"state.isAllExpanded\"\n\t\t\t\t\t\tdata-wp-class--inactive=\"state.isAllExpanded\"\n\t\t\t\t\t\tdata-wp-on--click=\"actions.onExpandAll\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t>\n\t\t\t\t\t\tExpand all\t\t\t\t\t<\/button>\n\t\t\t\t\t<span aria-hidden=\"true\"> | <\/span>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn btn-link m-0\"\n\t\t\t\t\t\tdata-bi-cN=\"Collapse all\"\n\t\t\t\t\t\tdata-wp-bind--aria-controls=\"state.ariaControls\"\n\t\t\t\t\t\tdata-wp-bind--aria-expanded=\"state.ariaExpanded\"\n\t\t\t\t\t\tdata-wp-bind--disabled=\"state.isAllCollapsed\"\n\t\t\t\t\t\tdata-wp-class--inactive=\"state.isAllCollapsed\"\n\t\t\t\t\t\tdata-wp-on--click=\"actions.onCollapseAll\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t>\n\t\t\t\t\t\tCollapse all\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t<ul class=\"msr-accordion\">\n\t\t\t\t\t\t\t\t<li class=\"m-0\" data-wp-context='{\"id\":\"accordion-content-2\"}' data-wp-init=\"callbacks.init\">\n\t\t<div class=\"accordion-header\">\n\t\t\t<button\n\t\t\t\taria-controls=\"accordion-content-2\"\n\t\t\t\tclass=\"btn btn-collapse\"\n\t\t\t\tdata-wp-bind--aria-expanded=\"state.isExpanded\"\n\t\t\t\tdata-wp-on--click=\"actions.onClick\"\n\t\t\t\tid=\"accordion-button-1\"\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\tAbout Ajax View\t\t\t<\/button>\n\t\t<\/div>\n\t\t<div\n\t\t\taria-labelledby=\"accordion-button-1\"\n\t\t\tclass=\"msr-accordion__content\"\n\t\t\tdata-wp-bind--inert=\"!state.isExpanded\"\n\t\t\tdata-wp-run=\"callbacks.run\"\n\t\t\tid=\"accordion-content-2\"\n\t\t>\n\t\t\t<div class=\"msr-accordion__body\">\n\t\t\t\t<p>The Ajax View approach is to insert a server-side proxy (or web server plugin) in-between the web server machines and the end-user&#8217;s browser. This proxy captures the web application&#8217;s JavaScript code as it is being sent to a browser and rewrites the code to insert extra instrumentation code. The injected instrumentation code runs with the rest of the web application inside the end-user&#8217;s browser and can capture performance, call graph, application state and user interaction information, providing visibility directly into the last hop of the user&#8217;s experience.<\/p>\n<p>Because Ajax View is rewriting web application code dynamically each time a user visits the web site, it can:<\/p>\n<ul>\n<li>Serve different instrumentation code to different users. This allows us to distribute instrumentation code across many users, spreading the cost of gathering lots of information such that no single user pays a high performance penalty.<\/li>\n<li>Adapt an instrumentation policy and serve different instrumentation code over time. For example, we can drill-down into performance problems and gather extra context about bugs.<\/li>\n<\/ul>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/li>\n\t\t<li class=\"m-0\" data-wp-context='{\"id\":\"accordion-content-4\"}' data-wp-init=\"callbacks.init\">\n\t\t<div class=\"accordion-header\">\n\t\t\t<button\n\t\t\t\taria-controls=\"accordion-content-4\"\n\t\t\t\tclass=\"btn btn-collapse\"\n\t\t\t\tdata-wp-bind--aria-expanded=\"state.isExpanded\"\n\t\t\t\tdata-wp-on--click=\"actions.onClick\"\n\t\t\t\tid=\"accordion-button-3\"\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\tWalkthrough\t\t\t<\/button>\n\t\t<\/div>\n\t\t<div\n\t\t\taria-labelledby=\"accordion-button-3\"\n\t\t\tclass=\"msr-accordion__content\"\n\t\t\tdata-wp-bind--inert=\"!state.isExpanded\"\n\t\t\tdata-wp-run=\"callbacks.run\"\n\t\t\tid=\"accordion-content-4\"\n\t\t>\n\t\t\t<div class=\"msr-accordion__body\">\n\t\t\t\t<h1>Remotely Monitoring Client-Side Web App Performance and Behavior<\/h1>\n<p>By Emre K\u0131c\u0131man and Benjamin LivshitsDo you know what your users are experiencing when they visit your AJAX application?\u00a0 Is your JavaScript code running fast, slow, or generating errors in your users&#8217; browsers?<\/p>\n<p>The Ajax View project at Microsoft Research aims to give developers easy visibility into their web apps\u2019 performance and behavior as the apps run in end-users\u2019 browsers.\u00a0\u00a0 Ajax View uses a server-side proxy to rewrite JavaScript &#8220;on-the-fly&#8221; and automatically inject instrumentation code into a web application.\u00a0 This instrumentation provides end-to-end visibility into app performance, behavior and critical state.\u00a0 &#8220;On-the-fly&#8221; rewriting allows Ajax View to serve different instrumentation across users and over time, capturing more detail about app behavior while minimizing per-user performance overhead.<\/p>\n<p>In this lab, you will use an early prototype of Ajax View technology to quickly enable cross-browser performance profiling of web apps, without modifying the original web app code or the client-side browser.\u00a0 \u00a0First, you will startup Ajax View as a client-side proxy.\u00a0 Then, you will browse a web application while Ajax View monitors its function-level performance, and see the resulting profile information.<\/p>\n<p><b>Research Prototype Warning:<\/b>\u00a0 Ajax View is an early preview of work we have been doing at Microsoft Research.\u00a0 Our prototype is often rough around the edges, not as fast as it could be, not scalable, etc.<\/p>\n<h2>Performance Profiling Walk-Through<\/h2>\n<p>First, if you haven\u2019t already, download and install the Ajax View prototype.<\/p>\n<p>Then, let\u2019s start the Ajax View client-side proxy:<\/p>\n<ul>\n<li>Start Ajax View by clicking on the <b>Ajax View Proxy <\/b>icon in your start menu.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">If you are running Windows Vista, you should see a dialog asking you to allow Ajax View to run with administrator privileges. Click allow.<\/p>\n<ul>\n<li>Ajax View is now running as a proxy, ready to intercept and rewrite web applications\u2019 JavaScript code.\u00a0 By default, Ajax View listens for connections on port 8888.<span id=\"93342034-de4f-4ce9-9481-9c64e7ede728\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image93342034-de4f-4ce9-9481-9c64e7ede728\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image001.jpg\" alt=\"\" \/><span id=\"ImageCaption93342034-de4f-4ce9-9481-9c64e7ede728\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Next, let\u2019s open a web browser and use a web application:<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Open either Internet Explorer or Firefox.<\/p>\n<p style=\"padding-left: 30px;\">Because Ajax View does not require browser plugins or ActiveX controls, it can profile and monitor app behavior as they run in either Internet Explorer or Firefox.<\/p>\n<p style=\"padding-left: 30px;\"><strong>Note:<\/strong> Both browsers\u2019 proxy settings have already been preset to use the Ajax View proxy<\/p>\n<ul>\n<li>Set the browser\u2019s proxy settings to localhost port 8888:<\/li>\n<li>Open the Tools menu, and click on the Internet Options menu item.<span id=\"9109a144-925b-437d-8671-1eff8befbd8a\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image9109a144-925b-437d-8671-1eff8befbd8a\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image002.jpg\" alt=\"\" \/><span id=\"ImageCaption9109a144-925b-437d-8671-1eff8befbd8a\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Click on the Connections tab in the Internet Options dialog box.<span id=\"702f8247-bf35-46c7-b095-127a1cb3b039\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image702f8247-bf35-46c7-b095-127a1cb3b039\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image003.png\" alt=\"\" \/><span id=\"ImageCaption702f8247-bf35-46c7-b095-127a1cb3b039\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Click on the LAN Settings button in the Connections pane.<span id=\"012b19c9-2c9f-422c-a804-78585d0ef58b\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image012b19c9-2c9f-422c-a804-78585d0ef58b\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image004.png\" alt=\"\" \/><span id=\"ImageCaption012b19c9-2c9f-422c-a804-78585d0ef58b\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Uncheck \u201cAutomatically detect settings.\u201d<\/li>\n<li>Check \u201cUse proxy server for your LAN\u201d and ensure that the address is set to localhost and the port is set to 8888.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\"><span id=\"b84df1e3-a40c-4f2f-b79f-77dde7229e31\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Imageb84df1e3-a40c-4f2f-b79f-77dde7229e31\" class=\"alignnone\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image005.png\" alt=\"\" \/><span id=\"ImageCaptionb84df1e3-a40c-4f2f-b79f-77dde7229e31\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>Note:<\/strong>\u00a0The Ajax View proxy does not support HTTPS \/ SSL connections.\u00a0 If you want to browse HTTPS sites while Ajax View is enabled, click through to the Advanced settings, uncheck the option to \u201cuse the same proxy server for all protocols,\u201d and enter Ajax View only for the HTTP protocol.\u00a0 Leave the Secure, FTP\u00a0 and SOCKS protocol proxies blank or set to your previous proxy.<\/p>\n<ul>\n<li>Go to <a class=\"msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall\" rel=\"noopener noreferrer\" target=\"_blank\" href=\"http:\/\/maps.live.com\/\">http:\/\/maps.live.com\/<span class=\"sr-only\"> (opens in new tab)<\/span><\/a><\/li>\n<li>Once the page has loaded, search for hotels in las vegas by typing \u201chotels\u201d in the top search box, and \u201clas vegas, nv\u201d in the address box.<span id=\"f6cb33da-5985-4285-aeba-0f11fb13d049\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Imagef6cb33da-5985-4285-aeba-0f11fb13d049\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image006.png\" alt=\"\" \/><span id=\"ImageCaptionf6cb33da-5985-4285-aeba-0f11fb13d049\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Double-click a few times in the middle of the map to zoom into the center of Las Vegas.\u00a0 While you use maps.live.com, Ajax View is monitoring and capturing the applications behavior.<span id=\"e9ae455e-a548-41e7-9d42-6aa92e1a924b\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Imagee9ae455e-a548-41e7-9d42-6aa92e1a924b\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image007.jpg\" alt=\"\" \/><span id=\"ImageCaptione9ae455e-a548-41e7-9d42-6aa92e1a924b\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Now, it\u2019s time to look at the information that Ajax View has gathered.<\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">Press CTRL+T to open a new tab.<\/p>\n<ul>\n<li>Open the web page <a class=\"msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall\" rel=\"noopener noreferrer\" target=\"_blank\" href=\"http:\/\/fakeurl.com\/?&AJAXVIEWREQUEST=GET=main.html\">http:\/\/fakeurl.com\/?&AJAXVIEWREQUEST=GET=main.html<span class=\"sr-only\"> (opens in new tab)<\/span><\/a><\/li>\n<\/ul>\n<p style=\"padding-left: 30px;\">This URL will be intercepted by the Ajax View proxy.\u00a0 Instead of sending this request to \u201cfakeurl.com\u201d, Ajax View will return its own statistics page.<\/p>\n<ul>\n<li>Click the \u201cJS Performance Statistics\u201d link.<span id=\"26b7ac03-6aed-45cc-bc27-374a76efcdb7\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image26b7ac03-6aed-45cc-bc27-374a76efcdb7\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image008.jpg\" alt=\"\" \/><span id=\"ImageCaption26b7ac03-6aed-45cc-bc27-374a76efcdb7\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>The right pane is now showing a list of urls that we have visited while running our application, grouped by top-level domain. The first column shows the URL itself, the second column shows the number of JavaScript functions and scripts that are defined within the file, and the third column displays the performance of the slowest function within the file.<span id=\"6e90c372-32f7-4a5c-98c7-ecc5e11c4116\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image6e90c372-32f7-4a5c-98c7-ecc5e11c4116\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image009.jpg\" alt=\"\" \/><span id=\"ImageCaption6e90c372-32f7-4a5c-98c7-ecc5e11c4116\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Let\u2019s click on one of these URLs, the \u201cmapcontrol\u201d file, shown as the link:sc1.local.live.com\/mapcontrol.asjx?&#8230;<\/li>\n<li>Now, the right pane is showing a list of all the JavaScript functions defined in this file.\u00a0 The columns of data show performance information for each function.<span id=\"efbff73c-7098-42a5-9540-3e49731c378d\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Imageefbff73c-7098-42a5-9540-3e49731c378d\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image010.jpg\" alt=\"\" \/><span id=\"ImageCaptionefbff73c-7098-42a5-9540-3e49731c378d\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Let\u2019s see what the slowest functions were. Click on the \u201cMean Time (ms)\u201d column to sort the table by this column.<span id=\"ab8c5456-88b7-4b73-a8ba-6af2b714b35c\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Imageab8c5456-88b7-4b73-a8ba-6af2b714b35c\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image011.jpg\" alt=\"\" \/><span id=\"ImageCaptionab8c5456-88b7-4b73-a8ba-6af2b714b35c\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Let\u2019s get more detail about the performance profile of double-clicking to zoom in on the map.\u00a0\u00a0 Click on the \u201cDetails\u201d link next to the \u201cthis.Init\u201d function.<\/li>\n<li>Now, we see a list of the functions that are called by the \u201cthis.Init\u201d function, sorted by their average performance.<span id=\"00ab770f-9823-46d1-85f9-5ef6d4177431\" class=\"ImageBlock fn\"><img decoding=\"async\" id=\"Image00ab770f-9823-46d1-85f9-5ef6d4177431\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2016\/02\/ajaxview-image012.jpg\" alt=\"\" \/><span id=\"ImageCaption00ab770f-9823-46d1-85f9-5ef6d4177431\" class=\"ImageCaptionCoreCss ImageCaption\"><\/span><\/span><\/li>\n<li>Now, try it with your own web application! Just browse to the site and then return to the Ajax View main page to see the statistics.<\/li>\n<\/ul>\n<h2>How It Works<\/h2>\n<p>Ajax View works by using a proxy to intercept and rewrite the JavaScript code of a web application and automatically inject instrumentation code.\u00a0 The rewriting is controlled by one or more instrumentation policies, embedded within the proxy.<\/p>\n<p>In this demo, you have seen a simple performance profiling policy that adds log statements to the beginning and end of every script block and function definition within the JavaScript code of a web application.\u00a0 This rewriting policy takes a script that looks like:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-276654\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2007\/04\/ajax_code1.png\" alt=\"ajax_code1\" width=\"317\" height=\"90\" srcset=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2007\/04\/ajax_code1.png 317w, https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2007\/04\/ajax_code1-300x85.png 300w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/p>\n<p>And turns it into a script that looks like:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-276657\" src=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2007\/04\/ajax_code2.png\" alt=\"ajax_code2\" width=\"327\" height=\"170\" srcset=\"https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2007\/04\/ajax_code2.png 327w, https:\/\/www.microsoft.com\/en-us\/research\/wp-content\/uploads\/2007\/04\/ajax_code2-300x156.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/p>\n<p>Our prototype actually does a little more rewriting than is shown here.\u00a0 For example, it inlines the logging functions to reduce performance overhead, rewrites return statements, and keeps track of the line number and character offset of the function to help identify anonymous functions and disambiguate functions with the same name.<\/p>\n<p>Whenever the injected instrumentation logs an event, such as a function enter or exit, the event is timestamped and added to a queue. A timer event handler periodically empties the queue of messages and reports them back to the proxy via an HTTP post request.\u00a0 The proxy is responsible for analyzing the results and generating the per-function performance statistics.<\/p>\n<h2>Conclusion<\/h2>\n<p>You have used the Ajax View proxy to gather performance profile information for a web application, without modifying the original web application, and without installing any extra plugins, ActiveX controls or extensions in the web browser.<\/p>\n<p>As Ajax View is currently an early research prototype, we are considering several future directions for the project, including further research into instrumentation policies to help developers debug their application, and the possibilities of integrating this technology into developer tools and\/or web server infrastructure.<\/p>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/li>\n\t\t<li class=\"m-0\" data-wp-context='{\"id\":\"accordion-content-6\"}' data-wp-init=\"callbacks.init\">\n\t\t<div class=\"accordion-header\">\n\t\t\t<button\n\t\t\t\taria-controls=\"accordion-content-6\"\n\t\t\t\tclass=\"btn btn-collapse\"\n\t\t\t\tdata-wp-bind--aria-expanded=\"state.isExpanded\"\n\t\t\t\tdata-wp-on--click=\"actions.onClick\"\n\t\t\t\tid=\"accordion-button-5\"\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\tSend Us Feedback\t\t\t<\/button>\n\t\t<\/div>\n\t\t<div\n\t\t\taria-labelledby=\"accordion-button-5\"\n\t\t\tclass=\"msr-accordion__content\"\n\t\t\tdata-wp-bind--inert=\"!state.isExpanded\"\n\t\t\tdata-wp-run=\"callbacks.run\"\n\t\t\tid=\"accordion-content-6\"\n\t\t>\n\t\t\t<div class=\"msr-accordion__body\">\n\t\t\t\t<ul>\n<li><a href=\"mailto:ajaxview@microsoft.com\">ajaxview@microsoft.com<\/a><\/li>\n<\/ul>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/li>\n\t\t<li class=\"m-0\" data-wp-context='{\"id\":\"accordion-content-8\"}' data-wp-init=\"callbacks.init\">\n\t\t<div class=\"accordion-header\">\n\t\t\t<button\n\t\t\t\taria-controls=\"accordion-content-8\"\n\t\t\t\tclass=\"btn btn-collapse\"\n\t\t\t\tdata-wp-bind--aria-expanded=\"state.isExpanded\"\n\t\t\t\tdata-wp-on--click=\"actions.onClick\"\n\t\t\t\tid=\"accordion-button-7\"\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\tDownloads\t\t\t<\/button>\n\t\t<\/div>\n\t\t<div\n\t\t\taria-labelledby=\"accordion-button-7\"\n\t\t\tclass=\"msr-accordion__content\"\n\t\t\tdata-wp-bind--inert=\"!state.isExpanded\"\n\t\t\tdata-wp-run=\"callbacks.run\"\n\t\t\tid=\"accordion-content-8\"\n\t\t>\n\t\t\t<div class=\"msr-accordion__body\">\n\t\t\t\t<ul>\n<li><a class=\"msr-external-link glyph-append glyph-append-open-in-new-tab glyph-append-xsmall\" href=\"http:\/\/code.msdn.microsoft.com\/\/ajaxview\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft Visual Studio AJAX Profiling Extensions Power Tool<span class=\"sr-only\"> (opens in new tab)<\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.microsoft.com\/en-us\/research\/download\/ajax-view-javascript-instrumentation-proxy\/\">Ajax View JavaScript Instrumentation Proxy<\/a>\u00a0(first release of our client-side prototype)<\/li>\n<\/ul>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t<\/div>\n\t\n","protected":false},"excerpt":{"rendered":"<p>Ajax View enables developer to see and control the behaviors of their web applications on user&#8217;s desktops. &nbsp; &nbsp; News April 29, 2009: The technology in Ajax View is now available as a Power Tool: Microsoft Visual Studio AJAX Profiling Extensions. This power tool includes a server-side extension to IIS to add profiling code to [&hellip;]<\/p>\n","protected":false},"featured_media":0,"template":"","meta":{"msr-url-field":"","msr-podcast-episode":"","msrModifiedDate":"","msrModifiedDateEnabled":false,"ep_exclude_from_search":false,"_classifai_error":"","footnotes":""},"research-area":[13560,13547],"msr-locale":[268875],"msr-impact-theme":[],"msr-pillar":[],"class_list":["post-169440","msr-project","type-msr-project","status-publish","hentry","msr-research-area-programming-languages-software-engineering","msr-research-area-systems-and-networking","msr-locale-en_us","msr-archive-status-active"],"msr_project_start":"2007-04-30","related-publications":[154717,154718],"related-downloads":[],"related-videos":[],"related-groups":[],"related-events":[],"related-opportunities":[],"related-posts":[],"related-articles":[],"tab-content":[],"slides":[],"related-researchers":[{"type":"user_nicename","display_name":"Emre Kiciman","user_id":31739,"people_section":"Group 1","alias":"emrek"}],"msr_research_lab":[199565],"msr_impact_theme":[],"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-project\/169440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-project"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/types\/msr-project"}],"version-history":[{"count":2,"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-project\/169440\/revisions"}],"predecessor-version":[{"id":604179,"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-project\/169440\/revisions\/604179"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/media?parent=169440"}],"wp:term":[{"taxonomy":"msr-research-area","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/research-area?post=169440"},{"taxonomy":"msr-locale","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-locale?post=169440"},{"taxonomy":"msr-impact-theme","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-impact-theme?post=169440"},{"taxonomy":"msr-pillar","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/research\/wp-json\/wp\/v2\/msr-pillar?post=169440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}