{"id":383,"date":"2015-01-27T11:13:07","date_gmt":"2015-01-27T11:13:07","guid":{"rendered":"http:\/\/adriangrigoras.com\/blog\/?p=383"},"modified":"2015-01-27T11:13:07","modified_gmt":"2015-01-27T11:13:07","slug":"rich-internet-application-ria-checklist","status":"publish","type":"post","link":"https:\/\/adriangrigoras.com\/blog\/rich-internet-application-ria-checklist\/","title":{"rendered":"Rich Internet Application (RIA) Checklist"},"content":{"rendered":"<h3>Design Considerations<\/h3>\n<ul>\n<li>The application is designed for running in the browser sandbox.<\/li>\n<li>The application is designed for supporting multiple browsers and operating systems.<\/li>\n<li>The application detects when the browser plug-in is not installed and takes the appropriate action.<\/li>\n<li>The application provides alternative for clients that do not have RIA support.<\/li>\n<li>The application uses mechanisms to increase performance and responsiveness.<\/li>\n<\/ul>\n<h3>Business Layer<\/h3>\n<ul>\n<li>Business logic is located on the server and exposed through Web services.<\/li>\n<li>Business logic is moved to the client, only when it improves the overall system performance or makes the UI more responsive.<\/li>\n<li>Business logic on the client is deployed in a separate assembly that the application can load and update independently.<\/li>\n<li>Logic that is duplicated on the client and the server is written in the same code language where possible.<\/li>\n<li>Sensitive business logic deployed on the client is encrypted.<\/li>\n<\/ul>\n<h3>Caching<\/h3>\n<ul>\n<li>Components and objects that are not likely to change during a session are cached on the client using the browser cache.<\/li>\n<li>Information that changes during a session, or which should persist between sessions, is cached in specific RIA local storage.<\/li>\n<li>Application modules are intelligently divided for efficient installation, updates, and loading.<\/li>\n<li>The application loads stubs dynamically at start-up and then loads additional functionality in the background.<\/li>\n<li>The application uses events to intelligently pre-load modules just before they are required.<\/li>\n<li>The application checks the local RIA storage, before writing the data, and asks the user to increase the storage, if it is not large enough.<\/li>\n<\/ul>\n<h3>Communication<\/h3>\n<ul>\n<li>Background threads and asynchronous execution are used for long-running code routines to avoid blocking the UI thread.<\/li>\n<li>Compatible bindings are used for the RIA applications and services it calls.<\/li>\n<li>The cross-domain configuration mechanism is used to allow the application to access a server other than the one from which it was downloaded.<\/li>\n<li>Sockets are used to proactively push data to the client where client polling would cause heavy server load.<\/li>\n<li>Sockets are used to push information to the server when this is significantly more efficient than using Web services; for example, real-time multi-player gaming scenarios utilizing a central server.<\/li>\n<\/ul>\n<h3>Controls<\/h3>\n<ul>\n<li>Native RIA controls are used where possible.<\/li>\n<li>Third-party RIA-specific controls are used when an appropriate native control is not available.<\/li>\n<li>A windowless RIA control in combination with an HTML or Windows Forms control supporting required functionality is used when a native or third-party RIA control is not available.<\/li>\n<li>Control sub-classing is not used to extend functionality; instead behaviors are attached to existing controls where the RIA technology supports it.<\/li>\n<\/ul>\n<h3>Composition<\/h3>\n<ul>\n<li>Composite View pattern is used to combine modular, atomic component parts to create composite views.<\/li>\n<li>Composition is used for interfaces that gather information from many disparate sources that are user-configurable or change frequently.<\/li>\n<li>RIA and the existing HTML are mixed on the same page to migrate an existing HTML application, in order to minimize application reengineering.<\/li>\n<\/ul>\n<h3>Data Access<\/h3>\n<ul>\n<li>The number of round-trips to the server is minimized, while still providing a responsive user interface.<\/li>\n<li>Data is filtered at the server rather than at the client to reduce the amount of data that must be sent over the network.<\/li>\n<li>Services are used to access data for operation-based applications.<\/li>\n<\/ul>\n<h3>Exception Management<\/h3>\n<ul>\n<li>Exceptions are not used to control business logic.<\/li>\n<li>Exceptions are caught only if they can be handled.<\/li>\n<li>Exception propagation strategy is designed to log and transform exceptions at boundary layers before passing to the next layer.<\/li>\n<li>The application uses try\/catch blocks to trap exceptions in synchronous code.<\/li>\n<li>Exception handling for asynchronous service calls is located in the separate handler.<\/li>\n<li>Unhandled exceptions passed to the browser are trapped and a user friendly error message is displayed.<\/li>\n<li>The server is notified of client exceptions, whenever required.<\/li>\n<li>The application displays user-friendly error messages.<\/li>\n<\/ul>\n<h3>Logging<\/h3>\n<ul>\n<li>Business critical and system critical events are logged.<\/li>\n<li>Each user has separate logs; the different user logs on the machine are combined.<\/li>\n<li>Client logs are transferred to the server for processing.<\/li>\n<li>The application checks the maximum size limit of isolated storage, before writing the data, and asks the user to increase the storage, if it is not large enough.<\/li>\n<li>The design enables logging and transferring logs to the server when exceptions are encountered.<\/li>\n<\/ul>\n<h3>Media and Graphics<\/h3>\n<ul>\n<li>Streaming media and video are displayed in the browser and not by invoking a separate player utility.<\/li>\n<li>Media objects are positioned on whole pixels and presented in their native size to maximize performance.<\/li>\n<li>Adaptive streaming is used to gracefully and seamlessly handle varying bandwidth issues.<\/li>\n<li>The vector graphics engine is utilized to maximize drawing performance.<\/li>\n<li>The application considers the hardware acceleration limitations when designing graphics-intensive application.<\/li>\n<\/ul>\n<h3>Mobile<\/h3>\n<ul>\n<li>RIA client for mobile device is designed considering the RIA plug-in implementation available for the device.<\/li>\n<li>A single or similar codebase is used to maximize cross-platform capabilities.<\/li>\n<li>The UI layout is designed considering the smaller screen size.<\/li>\n<\/ul>\n<h3>Portability<\/h3>\n<ul>\n<li>The application design supports &#8220;write once, run everywhere&#8221; principle.<\/li>\n<li>The application does not use features available only on one platform, such as Windows Integrated Authentication to support multiple platforms.<\/li>\n<li>Development languages that are supported for both Rich Clients and RIAs are used.<\/li>\n<li>The application uses native RIA code libraries.<\/li>\n<\/ul>\n<h3>Presentation<\/h3>\n<ul>\n<li>Media objects are positioned on whole pixels and presented in their native size to avoid anti-alias issues that may cause fuzziness.<\/li>\n<li>The browser&#8217;s forward and back button events are trapped to avoid unintentional navigation away from your page.<\/li>\n<li>Deep linking methods are used for multi-page UIs to allow unique identification and navigation to individual application pages.<\/li>\n<li>The application manipulates the browser&#8217;s address text box content, history list, and back and forward buttons in multi-page UIs to implement normal Web page-like navigation.<\/li>\n<\/ul>\n<h3>State Management<\/h3>\n<ul>\n<li>Client\u2019s isolated storage is used to persist state between sessions.<\/li>\n<li>Client state is stored on the server, if loss of state on the client would be catastrophic to the application\u2019s function.<\/li>\n<li>Client state is stored on the server, if the client requires recovery of application state when using different accounts, or when running on other hardware installations.<\/li>\n<li>The client and server are synchronized at intelligent intervals, or at the end of a session when storing state on the server is necessary.<\/li>\n<li>Synchronization of stored state is verified between the client and server at startup, and inconsistencies are intelligently handled.<\/li>\n<li>RIA is designed for multiple concurrent sessions if multiple RIA instances can be initialized.<\/li>\n<\/ul>\n<h3>Validation<\/h3>\n<ul>\n<li>Client-side validation is used for better user experience. Server-side validation is used for security. Client-specific validation rules are cached in isolated storage.<\/li>\n<li>All client-controlled data is revalidated it on the server.<\/li>\n<li>The validation strategy is designed to constrain, reject and sanitize data.<\/li>\n<li>Single service calls perform validation rules on the server when the rules require access to server resource.<\/li>\n<li>Large volumes of client-side validation code are located in a separate downloadable module.<\/li>\n<\/ul>\n<h3>Performance Considerations<\/h3>\n<ul>\n<li>Components and objects that are not likely to change during a session are cached on the client using the browser cache.<\/li>\n<li>Information that changes during a session, or which should persist between sessions is cached in specific RIA local storage.<\/li>\n<li>The application loads stubs dynamically at start-up and then loads additional functionality in the background.<\/li>\n<li>Code routines that cause the heaviest server load or have the most impact on UI responsiveness are moved to or cached on the client.<\/li>\n<li>Scenario-based profiling is used to discover and target routines that cause the heaviest server load, or that have a major impact on UI responsiveness.<\/li>\n<li>Media objects are positioned on whole pixels and presented in native size.<\/li>\n<\/ul>\n<h3>Security Considerations<\/h3>\n<ul>\n<li>Sensitive data stored locally is encrypted using the platform encryption routines.<\/li>\n<li>An exception management strategy is used to prevent exposure of sensitive information through unhandled exceptions.<\/li>\n<li>Sensitive business logic is implemented through Web services or obfuscated when stored on the client.<\/li>\n<li>Dynamic loading of resources, and overwriting or clearing objects from memory, is used to minimize the amount of time that sensitive data is available on the client.<\/li>\n<\/ul>\n<h3>Deployment Considerations<\/h3>\n<ul>\n<li>The application can handle the scenario where the RIA browser plug-in is not installed.<\/li>\n<li>The application can manage redeployment of modules when still running on a client.<\/li>\n<li>The application is divided into logical modules that can be cached separately, and can be replaced easily without requiring the user to download the entire application again.<\/li>\n<li>The application components are versioned.<\/li>\n<\/ul>\n<h3>Distributed Deployment Considerations<\/h3>\n<ul>\n<li>Business logic that is shared by other applications is deployed using the distributed pattern.<\/li>\n<li>A firewall is installed between the client and the business layer.<\/li>\n<li>Access to other domains is enabled using a crossdomain.xml file.<\/li>\n<li>The presentation layer does not initiate, participate in, or vote on atomic transactions.<\/li>\n<li>Business logic uses a message-based interface.<\/li>\n<li>Sensitive data passed between different tiers is protected.<\/li>\n<\/ul>\n<h3>Load Balancing Considerations<\/h3>\n<ul>\n<li>The application avoids server affinity where possible.<\/li>\n<li>The application stores all state on the client and uses stateless business components.<\/li>\n<li>Load balancing is implemented for redirection of requests to the servers in an application farm.<\/li>\n<\/ul>\n<h3>Web Farm Considerations<\/h3>\n<ul>\n<li>Clustering is used to reduce the impact of hardware failures.<\/li>\n<li>The database is partitioned across multiple database servers when the application has high I\/O requirements.<\/li>\n<li>The Web farm routes all requests for the same user to the same server when the application must support server affinity.<\/li>\n<li>An out-of-process session service or a database server is used in the Web farm unless server affinity is implemented for all clients.<\/li>\n<\/ul>\n<p>Source: apparch.codeplex.com<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Design Considerations The application is designed for running in the browser sandbox. The application is designed for supporting multiple browsers and operating systems. The application detects when the browser plug-in is not installed and takes the appropriate action. The application provides alternative for clients that do not have RIA support. The application uses mechanisms to\u2026 <span class=\"read-more\"><a href=\"https:\/\/adriangrigoras.com\/blog\/rich-internet-application-ria-checklist\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[],"class_list":["post-383","post","type-post","status-publish","format-standard","hentry","category-architecture"],"_links":{"self":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts\/383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/comments?post=383"}],"version-history":[{"count":1,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts\/383\/revisions"}],"predecessor-version":[{"id":384,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/posts\/383\/revisions\/384"}],"wp:attachment":[{"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/media?parent=383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/categories?post=383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adriangrigoras.com\/blog\/wp-json\/wp\/v2\/tags?post=383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}