<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1903994502805233077</id><updated>2012-02-02T11:23:12.595-08:00</updated><category term='Crystal Reports'/><category term='Vista'/><category term='Slideshare'/><category term='ASP.NET 2.0'/><category term='Microsoft'/><category term='tools'/><category term='rtl'/><category term='SQL'/><category term='Technology'/><category term='workflow'/><category term='Cache'/><category term='Arabic'/><category term='Exchange'/><category term='Mango'/><category term='Calendar'/><category term='SQL Server'/><category term='Membership'/><category term='Oracle.DataAccess'/><category term='methodology'/><category term='InProc'/><category term='MasterPage'/><category term='Authorization'/><category term='life cycle'/><category term='Security'/><category term='Oracle'/><category term='StateServer'/><category term='Roles'/><category term='ASP.NET'/><category term='HTTP'/><category term='Windows Phone'/><category term='Login Form'/><category term='sharepoint'/><category term='Profiler'/><category term='Personalization'/><category term='ORM'/><category term='Software'/><category term='trivia'/><category term='right'/><category term='Presentation'/><category term='developer'/><category term='LLBLGen Pro'/><category term='Deploy'/><category term='float'/><category term='DAL'/><category term='Windows Forms'/><category term='ODP.NET'/><category term='Providers'/><category term='asp:menu'/><category term='OWA'/><category term='process'/><category term='GridView'/><category term='Localization'/><category term='multi-Lingual'/><category term='Development ASP.NET Web Site Standards'/><category term='WP7'/><category term='imagine cup'/><category term='Session'/><category term='IIS'/><category term='tempdb'/><category term='Profiles'/><category term='ASPState'/><category term='C#'/><category term='visual studio'/><category term='OracleConnection'/><category term='Windows Phone 7'/><category term='Development'/><category term='Data Provider'/><category term='Data'/><category term='infopath'/><category term='Agile'/><category term='Hijri'/><category term='Main Form'/><category term='Authentication'/><category term='SessionID'/><category term='project'/><title type='text'>Lancer in The Park</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6541511297600201912</id><published>2011-08-22T16:40:00.000-07:00</published><updated>2011-08-23T01:29:43.253-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><category scheme='http://www.blogger.com/atom/ns#' term='Profiler'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>ORM Profiler</title><content type='html'>&lt;a href="http://www.sd.nl/"&gt;Solutions Design&lt;/a&gt; released the beta version of it's new comer &lt;a href="http://www.ormprofiler.com/"&gt;ORM Profiler&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I enjoyed working with Frans Bouma in this project. It's not the first time to work with Frans, but this time was the best development experience so far. I enjoyed the discussions the most :)&lt;br /&gt;&lt;br /&gt;The ORM Profiler, profiles the DAL of your application, analyzes the outcome, and warns you about probable weak points in your DAL.&lt;br /&gt;It should save you big time, tuning your DAL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;By the way if you want a free license of the ORM Profiler, register for the first 50 beta testers.&lt;br /&gt;Read &lt;a href="http://weblogs.asp.net/fbouma/archive/2011/08/22/introducing-orm-profiler-beta-testers-wanted.aspx"&gt;Frans Bouma's post&lt;/a&gt; about it.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6541511297600201912?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6541511297600201912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6541511297600201912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6541511297600201912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6541511297600201912'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/08/orm-profiler.html' title='ORM Profiler'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6495738959260436451</id><published>2011-08-20T23:53:00.001-07:00</published><updated>2011-08-22T08:00:00.545-07:00</updated><title type='text'>WP7 Session for the Start-up Summer Camp</title><content type='html'>Yesterday I was pleased to deliver a session at the American University in Cairo, for young Egyptians digging their way in the software industry.&lt;br /&gt;I started by dropping some show of hands question to know what background does the audience have. &lt;br /&gt;&lt;br /&gt;I had almost 3 hours and wanted to go through the following items:&lt;br /&gt;&lt;br /&gt;1- Problems faced when developing for the mobile. (Opposed to the PC).&lt;br /&gt;2- What are Silverlight and XAML?&lt;br /&gt;3- What files to expect in a WP7 project.&lt;br /&gt;4- Some Design tips&lt;br /&gt;5- Layout Controls (Grid - Stack - Canvas)&lt;br /&gt;6- Pivot and Panorama controls/projects&lt;br /&gt;7- Application Life-Cycle (before and after Mango).&lt;br /&gt;8- Multitasking capabilities and limitations.&lt;br /&gt;9- Push Notification&lt;br /&gt;10- Q&amp;A.&lt;br /&gt;&lt;br /&gt;I succeeded to squeeze the above subjects in 3 hours with few demo projects, but I had no time for live coding.&lt;br /&gt;&lt;br /&gt;I wish the attendees had brief background about WP7 so I could have skipped some of the above list and did one or 2 projects from scratch, I was ready to show them one simple game developed using Silverlight. But the show of hands questions on the beginning of the session showed there was only couple of attendees who had some knowledge with WPF, Silverlight and/or XAML.&lt;br /&gt;&lt;br /&gt;Very few seemed to have experience with other mobile platforms. But many others did not seem to know what an "Exception" is, or maybe they did but were too shy or too tired to speak. (Might have been a side effect of fasting)&lt;br /&gt;&lt;br /&gt;But that was my main issue in the session, the lack of responses from the audience. I could hardly get any solid feedback and so I had no idea if I was making any sense to the majority or I was completely out of context. I even asked the questions I thought they would normally ask. Only 5 or 6 out of 40 something were active every now and then. But the majority was silent.&lt;br /&gt;&lt;br /&gt;Although some came to me praising the session or asking for more details after I was done, but I felt the majority were bored, and that the session was not for them. Even I was bored, so I can’t blame them.&lt;br /&gt;&lt;br /&gt;** To any of you who felt the session was boring, I’m sorry for that, but I really do need to hear from you. Even if you were not into development but it happened that you were there, please leave me a comment, and tell me what you expected from this session, your input will be much of a benefit to me, and to others who will attend my next sessions.&lt;br /&gt;&lt;br /&gt;* Some of the people I spoke to after the session thought I'm a Microsoft Employee :)&lt;br /&gt;Sorry guys I’m not.&lt;br /&gt;&lt;br /&gt;* One comment made my day: "Well, it’s all about marketing their product" :&gt;&lt;br /&gt;I wish MS guys can hear you; maybe they'll hire me for a job well done :)&lt;br /&gt;&lt;br /&gt;I won't speak for MS, coz it makes full sense they want to market their products.&lt;br /&gt;But as for me, I believe the main job of any presenter, public speaker or an instructor, is to sell the idea.&lt;br /&gt;&lt;br /&gt;But in case the comment meant, I was honest, speaking about the Pros and ignoring the Cons, well this could be understandable without being dis-honest unless the speaker did lie, but even that I claim innocent.&lt;br /&gt;&lt;br /&gt;As far as I remember, I've spoken about the current issues of WP7, I even spoke about the past ones, which are already solved by Mango.&lt;br /&gt;For those who have missed it, here are some of the Cons I spoke about.&lt;br /&gt;1- Native Arabic Support missing.&lt;br /&gt;2- There were no multitasking or back-ground services available.&lt;br /&gt;3- Now there is, but still not 100% what you can call multitasking.&lt;br /&gt;&lt;br /&gt;Anyway, hope to hear from you guys, thanks in advance.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6495738959260436451?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6495738959260436451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6495738959260436451' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6495738959260436451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6495738959260436451'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/08/notes-wp7-session-for-startup-summer.html' title='WP7 Session for the Start-up Summer Camp'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-3580376104157810930</id><published>2011-08-19T16:39:00.000-07:00</published><updated>2011-08-20T23:52:50.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mango'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Windows Phone 7 Resources</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Development tools:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=13890"&gt;Windows Phone Developer Tools 7.0 &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=11321"&gt;Windows Phone Developer Tools 7.1 (Beta)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://silverlight.codeplex.com/"&gt;Silverlight Toolkit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Still WP7 doesn't support Arabic, but you can use the following library of controls to display Arabic text.&lt;br /&gt;&lt;a href="http://arabic4wp7.codeplex.com/"&gt;Arabic for WP7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Important Documentation:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=20558"&gt;Microsoft Windows Phone Developer Documentation - Offline Version (CHM Format)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh202915(v=VS.92).aspx"&gt;User Experience Design Guidelines for Windows Phone&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://walaapoints.blogspot.com/2011/04/wp7-localization-explained.html"&gt;Windows Phone 7 Localization Explained (a previous post of mine).&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh184843(v=VS.92).aspx"&gt;Application Certification Requirements for Windows Phone&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you live in a country not yet eligible tosubmit apps to the AppHub, you may use:&lt;br /&gt;&lt;a href="http://www.yallaapps.com/"&gt;Yalla Apps&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(EDIT)&lt;br /&gt;&lt;a href="http://skydrive.live.com/redir.aspx?cid=20572f0b9b0a1e8b&amp;page=browse&amp;resid=20572F0B9B0A1E8B!231&amp;type=6&amp;Bsrc=EMSHYH&amp;Bpub=SN.Notifications"&gt;The Presentation&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-3580376104157810930?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/3580376104157810930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=3580376104157810930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/3580376104157810930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/3580376104157810930'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/08/windows-phone-7-resources.html' title='Windows Phone 7 Resources'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-5067168088281466518</id><published>2011-06-07T10:58:00.000-07:00</published><updated>2011-11-28T23:12:06.846-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Main Form'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Login Form'/><title type='text'>Login and Main Forms</title><content type='html'>Many Windows Forms Developers are confused about a simple Use Case.&lt;br /&gt;&lt;br /&gt;The use case is:&lt;br /&gt;- User starts an application.&lt;br /&gt;- Login Form appears.&lt;br /&gt;- Application Exists if the user closes the Login Form.&lt;br /&gt;- Upon successful login the Login Form closes and the Main Form of the application shows.&lt;br /&gt;- Application Exists if the user closes the Main Form.&lt;br /&gt;&lt;br /&gt;Many developers suggests complex implementations including deriving from the  ApplicationContext and use the derived class in an overload to the Application.Run() method.&lt;br /&gt;Examples of what have been discussed:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1629205/windows-forms-create-the-main-application-after-login-which-form-to-run"&gt;http://stackoverflow.com/questions/1629205/windows-forms-create-the-main-application-after-login-which-form-to-run&lt;/a&gt;&lt;br /&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/73aeabe3-42db-4747-b3c7-9a5e4ea393ac/"&gt;http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/73aeabe3-42db-4747-b3c7-9a5e4ea393ac/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/cs/applicationcontextsplash.aspx"&gt;http://www.codeproject.com/KB/cs/applicationcontextsplash.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The implemntation can be much easier than this.&lt;br /&gt;The ide is to open the Login Form as a modal dialog in the MainForm Load event.&lt;br /&gt;And close the main form if the result was not OK.&lt;br /&gt;&lt;br /&gt;Try this:&lt;br /&gt;&lt;br /&gt;Here is the entry point (nothing done here):&lt;br /&gt;&lt;code&gt;static void Main()&lt;br /&gt;{&lt;br /&gt; Application.EnableVisualStyles();&lt;br /&gt; Application.SetCompatibleTextRenderingDefault(false);&lt;br /&gt; Application.Run(new MainForm());&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Login Form:&lt;br /&gt;&lt;code&gt;public partial class LoginForm : Form&lt;br /&gt;{&lt;br /&gt; private bool _authenticated = false;&lt;br /&gt;&lt;br /&gt; private void _loginBtn_Click(object sender, EventArgs e)&lt;br /&gt; {&lt;br /&gt;  if (AUTHENTICATION LOGIC)&lt;br /&gt;  {   &lt;br /&gt;   _authenticated = true;&lt;br /&gt;   this.Close();&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  MessageBox.Show("Login Failed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)&lt;br /&gt; {&lt;br /&gt;  if (_authenticated)&lt;br /&gt;   this.DialogResult = DialogResult.OK;&lt;br /&gt;  else&lt;br /&gt;   this.DialogResult = DialogResult.Abort;&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;Main Form:&lt;br /&gt;&lt;code&gt;public partial class MainForm : Form&lt;br /&gt;{&lt;br /&gt; private void MainForm_Load(object sender, EventArgs e)&lt;br /&gt; {&lt;br /&gt;  var loginForm = new LoginForm();&lt;br /&gt;  if (loginForm.ShowDialog() != DialogResult.OK)&lt;br /&gt;  {&lt;br /&gt;   this.Close();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That's it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-5067168088281466518?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/5067168088281466518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=5067168088281466518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5067168088281466518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5067168088281466518'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/06/login-form-main-form.html' title='Login and Main Forms'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6213219887618535100</id><published>2011-04-18T22:23:00.000-07:00</published><updated>2011-04-18T23:22:55.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='float'/><category scheme='http://www.blogger.com/atom/ns#' term='rtl'/><category scheme='http://www.blogger.com/atom/ns#' term='right'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='asp:menu'/><category scheme='http://www.blogger.com/atom/ns#' term='Arabic'/><title type='text'>ASP.NET Menu RTL</title><content type='html'>The ASP.NET Menu (asp:menu) has inline styles that forces left foating. You can find this out by examining the source of any page which has asp:menu tag. I don't know why this is forced, but anyway for right-to-left languages, you might need to float the menu to the right side. Now if you used tried to use float:right in the CSS, it on't apply as the inline style will overrule. To overcome this you have to modify the CSS style to the following: &lt;code&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;float&lt;/span&gt;:&lt;span style="color:#3333ff;"&gt;right !important;&lt;/span&gt;&lt;/strong&gt;&lt;/code&gt;The &lt;em&gt;&lt;strong&gt;!important&lt;/strong&gt;&lt;/em&gt; keyword denotes that this style should overrule the inline style.&lt;br /&gt;&lt;br /&gt;You will need to do the same thing in the &lt;strong&gt;.menu ul li&lt;/strong&gt; style.&lt;br /&gt;To let the menu items to start from the right. Otherwise you will find the last menu item comes first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6213219887618535100?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6213219887618535100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6213219887618535100' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6213219887618535100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6213219887618535100'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/04/aspnet-menu-rtl.html' title='ASP.NET Menu RTL'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-1113586741530452586</id><published>2011-04-06T16:44:00.000-07:00</published><updated>2011-06-13T07:31:00.175-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone'/><category scheme='http://www.blogger.com/atom/ns#' term='Localization'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>WP7 Localization Explained</title><content type='html'>I believe you are going to create a new Windows Phone Application to follow me in this article.&lt;br /&gt;I’ll assume you understand that everything that applies for a language, also applies for the language-Culture.&lt;br /&gt;I.e. you can use “en” for English or “en-UK” for English and United Kingdom culture.&lt;br /&gt;The language will affect the translation and what’s written in the resource files will be used for that sake, and the culture will affect the formats of date, currency…etc.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1 – Add Resource Files:&lt;/strong&gt;&lt;br /&gt;Anyone who has brief experience with localization in .net, will guess the first step.&lt;br /&gt;You have to add a Resource file for each language you need to use in your application.&lt;br /&gt;You should have a file for the default language and others for each other language used, having the same name as the default language file but with a small extension using each language abbreviation.&lt;br /&gt;Let’s say I’m going to support English (default) and Italian. Then I should end up having something like:&lt;br /&gt;&lt;br /&gt;MyResources.resx&lt;br /&gt;MyResources.it.resx&lt;br /&gt;&lt;br /&gt;If it’s your first time to use a resource file, this is added from: Project (right click) =&amp;gt; Add =&amp;gt; New Item =&amp;gt; (pick Resource File).&lt;br /&gt;- Needless to say, when you fill the resource files, the Name of each resource should match, and only the value should reflect the translation.&lt;br /&gt;- So say I’m going to have (Hello/Hello) &amp;amp; (Hello/Ciao) as the English &amp;amp; Italian (Name/Value)s.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2 – Declare the Languages you support:&lt;/strong&gt;&lt;br /&gt;We should tell the application which languages we are supporting. Guess it’s not smart enough to figure this out by itself.&lt;br /&gt;And for this you we’ll have to close the project/solution. Then open the project file in notepad, and add the supported languages (except the default one) in the supported cultures tag, using semi-colon as a separator, as follows:&lt;br /&gt;&lt;code&gt;&amp;lt;SupportedCultures&amp;gt;it;&amp;lt;/SupportedCultures&amp;gt;&lt;/code&gt;You’ll also need to define the default language in case the user is using a language you don’t support, and thus the default language should be used then.&lt;br /&gt;For that you need to go to the Project Properties =&amp;gt; Application (Tab) =&amp;gt; Assembly Information (button) =&amp;gt; Set the (Neutral Language).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 3 – Use Resource-File in code behind:&lt;/strong&gt;&lt;br /&gt;Let’s see if this is going to work.&lt;br /&gt;In the MainPage.xaml.cs, I’ll write the following in the CTor of the page.&lt;br /&gt;&lt;code&gt;PageTitle.Text = MyResources.Hello; &lt;/code&gt;&lt;br /&gt;&lt;strong&gt;Step 4 – Test:&lt;/strong&gt;&lt;br /&gt;Now you can test this on a device, and it should display the “Ciao” if you went to the phone settings and set “Italiano” as the display language.&lt;br /&gt;But the Emulator won’t let you change the “Display Language”, so if you want to test this in the Emulator, you will have to set the language-culture in code. (Just for testing).&lt;br /&gt;So go the App.xaml.cs and write the following in CTor or in the Launching event handler.&lt;br /&gt;&lt;code&gt;Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("it");&lt;/code&gt;You may also add the following if you are testing the culture (format of dates, currencies…etc.)&lt;br /&gt;&lt;code&gt;Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("it");&lt;/code&gt;** Don’t forget to remove these when you finish testing.&lt;br /&gt;Now you should see the localization working. I hate to say it but that’s not the end of it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;(UPDATE)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Now you can change the display language in the emulator, all you have to do is to click on the: "tap here to accept changes and restart your phone." link, which appears when you select a different Display Language.&lt;br /&gt;Still this might be consume more time than applying the change in code.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 5 – Access the Resource Files in XAML:&lt;/strong&gt;&lt;br /&gt;To use the resource files in XAML, you need to map them to a Static Resource, to able to bind to them.&lt;br /&gt;Say you have a TextBlock as follows.&lt;br /&gt;&lt;code&gt;&amp;lt;TextBlock Name="textBlock1" Text="Hello"&amp;gt;&lt;/code&gt;And instead of hardcoding the Text, we want to use the resource files. In other words we want to bind the Text property of the TextBlock to the appropriate key/property of the resource files.&lt;br /&gt;We will go and define the generated Resource class as a static resource in the App.xaml, as follows:&lt;br /&gt;&lt;code&gt;    &amp;lt;Application.Resources&amp;gt;&lt;br /&gt;     &amp;lt;local:MyResources xmlns:local ="clr-namespace:MyNamespace" x:Key="AnyGivenKey" /&amp;gt;&lt;br /&gt;   &amp;lt;/Application.Resources&amp;gt;&lt;/code&gt;Please make sure you replace MyNamespace with the namespace under which MyResources is defined.&lt;br /&gt;If you try to run the application now the following exception will blow right in your face:&lt;br /&gt;AG_E_PARSER_UNKNOWN_TYPE [Line: 10 Position: 65]&lt;br /&gt;Of type: &lt;em&gt;System.Windows.Markup.XamlParseException&lt;/em&gt;&lt;br /&gt;This issue has been reported here: &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/628281/silverlight-wp7-resource-files-and-binding"&gt;http://connect.microsoft.com/VisualStudio/feedback/details/628281/silverlight-wp7-resource-files-and-binding&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That’s because the class generated for the resource file was marked internal, and to access it from the XAML we need it to be public.&lt;br /&gt;If you open each of the resx files, you will find an option in the toolbar to change the access modifier.&lt;br /&gt;This should change the access modifier of the classes, but we still need to change the access modifier of the CTor. So you will have to open the default language resx.cs file, and look for the CTor and change the internal to public.&lt;br /&gt;&lt;br /&gt;Now the application can run safely without weird exceptions.&lt;br /&gt;And now it’s safe to go back to the TextBlock and change it to the following to use the Static Resource we just defined in the App.xaml:&lt;br /&gt;&lt;code&gt;&amp;lt;TextBlock Name="textBlock1" Text="{Binding Path=Hello, Source={StaticResource AnyGivenKey}}"/&amp;gt;&lt;/code&gt;That’s all? You wish…&lt;br /&gt;The problem now is: whenever you add extra resources to the resource files, the resx.cs class is re-generated and the modifier of the CTor gets set back to internal. So if you are happy with manually changing it each time you add a new resource and build your application, then you are done.&lt;br /&gt;If it’s cumbersome tedious thing to manage, then we need to find another solution.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 5.2 – Access the Resource Files in XAML:&lt;/strong&gt;&lt;br /&gt;To overcome this internal access modifier thing, we will create a class that wraps the generated resources class, and use that as our static resource in the App.xaml, as follows:&lt;br /&gt;&lt;code&gt;public class MyResourcesWrapper&lt;br /&gt;{&lt;br /&gt;public MyResourcesWrapper()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static MyResources _myWrappedResources = new MyResources();&lt;br /&gt;&lt;br /&gt;public MyResources MyWrappedResources { get { return _myWrappedResources; } }&lt;br /&gt;}&lt;/code&gt;And then our TextBlock should be changed to:&lt;br /&gt;&lt;code&gt;&amp;lt;TextBlock Name="textBlock1" Text="{Binding Path=MyWrappedResources.Hello, Source={StaticResource AnyGivenKey}}"/&amp;gt;&lt;/code&gt;You will need to modify the Resource definition in the App.xaml into the following:&lt;br /&gt;&lt;code&gt;    &amp;lt;Application.Resources&amp;gt;&lt;br /&gt;     &amp;lt;local:MyResourcesWrapper xmlns:local ="clr-namespace:MyNamespace" x:Key="AnyGivenKey" /&amp;gt;&lt;br /&gt;   &amp;lt;/Application.Resources&amp;gt;&lt;/code&gt;&lt;br /&gt;One extra step to go (if you need to localize the application bar).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 6 – Localizing the ApplicationBar:&lt;/strong&gt;&lt;br /&gt;The application bar is not growing out of the Silverlight, it’s a shell system tray.&lt;br /&gt;So using the binding method in the xaml file won’t work.&lt;br /&gt;We will have to add items to the application bar in the code behind and set the required localized text as we’ve done earlier in step 3.&lt;br /&gt;e.g.&lt;br /&gt;MainPage.xaml&lt;br /&gt;&lt;code&gt;&amp;lt;phone:PhoneApplicationPage.ApplicationBar&amp;gt;&lt;br /&gt;&amp;lt;shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"&amp;gt;&lt;br /&gt;&amp;lt;/shell:ApplicationBar&amp;gt;&lt;br /&gt;&amp;lt;/phone:PhoneApplicationPage.ApplicationBar&amp;gt;&lt;/code&gt;MainPage.xaml.cs&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ApplicationBar = new ApplicationBar();&lt;br /&gt;&lt;br /&gt;var appBarButton = new ApplicationBarIconButton(new Uri("/Images/appbar_button1.png", UriKind.Relative));&lt;br /&gt;appBarButton.Text = MyResources.Hello;&lt;br /&gt;ApplicationBar.Buttons.Add(appBarButton);&lt;br /&gt;&lt;br /&gt;var appBarMenuItem = new ApplicationBarMenuItem(MyResources.Hello);&lt;br /&gt;ApplicationBar.MenuItems.Add(appBarMenuItem);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;How to: Build a Localized Application for Windows Phone:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff637520%28v=VS.92%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff637520%28v=VS.92%29.aspx&lt;/a&gt;&lt;br /&gt;CultureInfo Class:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(VS.95).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(VS.95).aspx&lt;/a&gt;&lt;br /&gt;Extra link for the WP7 toolkit controls:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/delay/archive/2010/12/20/quot-and-she-d-say-can-you-see-what-i-m-saying-quot-how-to-localize-a-windows-phone-7-application-that-uses-the-windows-phone-toolkit-into-different-languages.aspx"&gt;http://blogs.msdn.com/b/delay/archive/2010/12/20/quot-and-she-d-say-can-you-see-what-i-m-saying-quot-how-to-localize-a-windows-phone-7-application-that-uses-the-windows-phone-toolkit-into-different-languages.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-1113586741530452586?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/1113586741530452586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=1113586741530452586' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/1113586741530452586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/1113586741530452586'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/04/wp7-localization-explained.html' title='WP7 Localization Explained'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6298707913894696448</id><published>2011-01-18T14:08:00.000-08:00</published><updated>2011-01-18T14:20:21.244-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cache'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Stopping IIS 6 Caching</title><content type='html'>One issue that I faced when deploying an ASP.NET 3.5 web application on IIS 6 (Windows Server 2003), was that web-pages always showed old data.&lt;br /&gt;&lt;br /&gt;For example a GridView didn't show inserted or updated data unless we refresh the page (F5). Or if we restart IIS (iisreset).&lt;br /&gt;&lt;br /&gt;After some googling it was apparent that this is an IIS6 issue.&lt;br /&gt;And every try to solve it by setting caching and expiration settings in IIS 6 failed.&lt;br /&gt;&lt;br /&gt;The only solution we found working is to hardcode the following in Global.asax&lt;br /&gt;&lt;code&gt;&lt;br /&gt;protected void Application_EndRequest(Object sender, EventArgs e) &lt;br /&gt;{&lt;br /&gt;     HttpContext.Current.Response.CacheControl = "no-cache"; &lt;br /&gt;} &lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6298707913894696448?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6298707913894696448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6298707913894696448' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6298707913894696448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6298707913894696448'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/01/stopping-iis-6-caching.html' title='Stopping IIS 6 Caching'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-2059050400502314365</id><published>2011-01-18T13:43:00.000-08:00</published><updated>2011-01-18T14:21:40.308-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>WebForm_postbackOptions is undefined</title><content type='html'>Yesterday we were deploying an ASP.NET application on a Windows Server 2003 &amp; IIS6.&lt;br /&gt;&lt;br /&gt;And suddenly we stumbled acorss a script error on every page the error was:&lt;br /&gt;&lt;strong&gt;"WebForm_postbackOptions is undefined"&lt;/strong&gt; and it was complaining about &lt;strong&gt;Scriptresource.axd&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It turned out to be the server clock (date in specific) was not correctly set.&lt;br /&gt;It was set somewhere in the past. And so IIS felt something fishy was going on, as the assemblies required to be loaded have build dates in the future.&lt;br /&gt;&lt;br /&gt;It took us quite some time to come to the core of this issue, having to go through many articles on the net, describing different causes and solutions to the same error.&lt;br /&gt;&lt;br /&gt;We got the hint from &lt;a href="http://siderite.blogspot.com/2009/07/webresourceaxd-or-scriptresourceaxd.html"&gt;Siderite blog&lt;/a&gt;. Thanks be to him :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-2059050400502314365?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/2059050400502314365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=2059050400502314365' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/2059050400502314365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/2059050400502314365'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2011/01/webformpostbackoptions-is-undefined.html' title='WebForm_postbackOptions is undefined'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6921806943796044960</id><published>2010-11-07T21:23:00.000-08:00</published><updated>2010-11-07T21:51:47.658-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Parser Error</title><content type='html'>I was deploying an ASP.NET application on IIS 5.1 the other day, when I was hit by the following error when trying to access some of the aspx pages from the browser.&lt;br /&gt;&lt;br /&gt;/*********************************************************************************/&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;strong&gt;Server Error in '/' Application. &lt;/strong&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Parser Error &lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#3333ff;"&gt;&lt;strong&gt;Description:&lt;/strong&gt; An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Parser Error Message:&lt;/strong&gt; Only Content controls are allowed directly in a content page that contains Content controls.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#3333ff;"&gt;Source Error:&lt;/span&gt;&lt;br /&gt;Line x: [/asp:content]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Line x+1: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;/*********************************************************************************/&lt;br /&gt;&lt;br /&gt;All pages were content pages of some master page. And nothing was written after the closing content tag.&lt;br /&gt;&lt;br /&gt;At first I thought this was some kind of .NET vs IIS version mismatch or that I needed to change some IIS settings, since this was running fine on different IIS versions.&lt;br /&gt;&lt;br /&gt;But to my surprise, some pages were displayed fine.&lt;br /&gt;&lt;br /&gt;After banging my head few times, I found out the cause. The pages that were complaining had some spaces and empty lines after the closing content tag. This should mean nothing in html, but I guess IIS 5.1 didn't like these.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Clearing everything so that the closing content tag is practically the last thing written in a page, did the trick.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Hope this becomes helpful to anyone facing the same issue.&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6921806943796044960?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6921806943796044960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6921806943796044960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6921806943796044960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6921806943796044960'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2010/11/parser-error.html' title='Parser Error'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-8435534320609619693</id><published>2009-07-05T02:47:00.000-07:00</published><updated>2009-12-28T04:57:52.990-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Localization'/><category scheme='http://www.blogger.com/atom/ns#' term='MasterPage'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='multi-Lingual'/><title type='text'>Localization with MasterPages - The Final Cut</title><content type='html'>I'll try to be short and to the point. You may skip all the following text description and go ahead to the code example.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Intro:&lt;/strong&gt;&lt;br /&gt;Assuming you want your ASP.NET website/web application to have a multi-lingual interface. You'll find multiple resources on the internet on how to use LocalResources files or GlobalResources files to store specific language's data.&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/5/E/B/5EBF4D5A-8B55-482A-A322-675EED8B7F45/hilo_localization_final.wmv"&gt;Nice Video Tour for Localization.&lt;/a&gt;&lt;br /&gt;A specific language resource would be loaded according to the user's browser language preferences.&lt;br /&gt;But most probably you'll need to give the user the option to switch between languages on the fly without going to the browser's preferences....makes sense.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Questions:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1- Where to store user language preference?&lt;/strong&gt;&lt;br /&gt;Some suggest using a Session variable to store the language preference across the pages. But shouldn't you be storing this for future uses? &lt;br /&gt;Some suggest using a Cookie, but this will be browser specific and/or a machine specific.&lt;br /&gt;IMHO, it would be perfect if the site can remember a user preference regardless of the browser or machine he uses to sign in. That's why storing it in the database might sound like the best option, and I use ASP.NET Profile for that.&lt;br /&gt;&lt;br /&gt;Btw, Profile usage is not as easy to use in a Web-Application project as it is in a WebSite project, as no custom class gets created to hold your profile properties defined in the web.config. Please check the code below to know how to manage Profile properties in a Web-Application.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2- How to switch it on the fly?&lt;/strong&gt;&lt;br /&gt;Simply by setting 2 properties: &lt;em&gt;CurrentThread.CurrentUICulture&lt;/em&gt; &amp;amp; &lt;em&gt;CurrentThread.CurrentCulture&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3- But where to set them?&lt;/strong&gt;&lt;br /&gt;Basic answer is to override the &lt;em&gt;InitializeCulture()&lt;/em&gt; method on each and every page in your application....not the smartest thing to do.&lt;br /&gt;Another suggestion is to let all your pages inherit from a BasePage class which in turn inherits from the Page class, and there you override the &lt;em&gt;InitializeCulture()&lt;/em&gt; method.&lt;br /&gt;The problem is that InitializeCulture() method is never called on cached pages. Ref: &lt;a href="http://blog.momeli.com/blog/ASPNET/_archives/2009/2/22/4101456.html"&gt;InitializeCulture and caching don't mix&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm using a MasterPage, can I do this in the code behind of the MasterPage.... The answer is a striking NO. The MasterPage doesn't inherit from the Page class, and it has no idea what InitializeCulture() is.&lt;br /&gt;&lt;br /&gt;If we want a global location to set the culture, then why not using the Global.asax class to set the culture in one of the events declared there.&lt;br /&gt;That's why many people who don't like to use the BasePage approach sugests using the&lt;br /&gt;&lt;em&gt;Application_BeginRequest()&lt;/em&gt; as a good location for this code.&lt;br /&gt;Good point, only that the Profile won't be read at this point, yet... so what's now.&lt;br /&gt;The answer is: &lt;strong&gt;&lt;em&gt;Application_PreRequestHandlerExecute()&lt;/em&gt;&lt;/strong&gt;. It's not there by default, you should add it yourself.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code example (might have a room for refactoring):&lt;/strong&gt;&lt;br /&gt;Here I use a couple of buttons on the master page for switching the language on the fly, you may use whatever approach you want to use.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public partial class Main : System.Web.UI.MasterPage&lt;br /&gt;{&lt;br /&gt;  protected void English_Click(object sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;    SwitchCulture("en-Us");&lt;br /&gt;  }&lt;br /&gt;  protected void Arabic_Click(object sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;    SwitchCulture("ar-Eg");&lt;br /&gt;  }&lt;br /&gt;  private void SwitchCulture(string culture)&lt;br /&gt;  {&lt;br /&gt;    CultureHelper.SaveCulture(culture);&lt;br /&gt;    Response.Redirect(Request.Url.AbsolutePath);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;As said before thie event is not there by default when you add the Global class to your application.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Global : System.Web.HttpApplication&lt;br /&gt;{&lt;br /&gt;  protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)&lt;br /&gt;  {&lt;br /&gt;    CultureHelper.SetCulture();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I created a class to encapsulate the culture manipulation.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class CultureHelper&lt;br /&gt;{&lt;br /&gt;  public static void SaveCulture(string culture)&lt;br /&gt;  {&lt;br /&gt;    HttpContext.Current.Profile.SetPropertyValue("Culture", culture);&lt;br /&gt;  }&lt;br /&gt;  public static void SetCulture()&lt;br /&gt;  {&lt;br /&gt;    var culture = GetCulture();&lt;br /&gt;    if(string.IsNullOrEmpty(culture))&lt;br /&gt;      return;&lt;br /&gt;    var cultureInfo = new CultureInfo(culture);&lt;br /&gt;    Thread.CurrentThread.CurrentUICulture = cultureInfo;&lt;br /&gt;    Thread.CurrentThread.CurrentCulture = cultureInfo;&lt;br /&gt;  }&lt;br /&gt;  private static string GetCulture()&lt;br /&gt;  {&lt;br /&gt;    var culture = string.Empty;&lt;br /&gt;    if (HttpContext.Current.Profile != null)&lt;br /&gt;    {&lt;br /&gt;      culture = (string) HttpContext.Current.Profile.GetPropertyValue("Culture");&lt;br /&gt;    }&lt;br /&gt;    return culture;&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And don't forget the Profile property definition in the web.config&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  [system.web]&lt;br /&gt;    [anonymousIdentification enabled="true"/]&lt;br /&gt;    [profile]&lt;br /&gt;      [properties]&lt;br /&gt;          [add name="Culture" allowAnonymous="true" defaultValue="Auto" type="string"/]&lt;br /&gt;      [/properties]     &lt;br /&gt;    [/profile]&lt;br /&gt;    ...&lt;br /&gt;  [/system.web]&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-8435534320609619693?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/8435534320609619693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=8435534320609619693' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/8435534320609619693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/8435534320609619693'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2009/07/localization-with-masterpages-final-cut.html' title='Localization with MasterPages - The Final Cut'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6199779443820241943</id><published>2009-02-17T03:16:00.000-08:00</published><updated>2009-02-17T03:28:20.887-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technology'/><category scheme='http://www.blogger.com/atom/ns#' term='Slideshare'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>"Agile Simplified" is being showcased</title><content type='html'>I just received an e-mail from &lt;a href="http://www.slideshare.net/"&gt;www.SlideShare.net&lt;/a&gt; saying my presentation &lt;a href="http://www.slideshare.net/Walaa_M_Atef/agile-simplified%3EAgile%20Simplified?from=email&amp;amp;type=slideshow_cat_featured" target="_blank" rel="nofollow"&gt;Agile Simplified&lt;/a&gt; is currently being showcased on the &lt;a href="http://www.slideshare.net/category/technology" target="_blank" rel="nofollow"&gt;'Technology'&lt;/a&gt; page by their editorial team. It's likely to be there for the next 16-20 hours...&lt;br /&gt;&lt;br /&gt;Most probably this happens for all new posted presentations, each might get showcased in its own category, and their so called editorial team might just be an electronic one :)  I mean automatic selection.&lt;br /&gt;So although it shouldn't mean any extra credit, it won't hurt to brag about it :) :)&lt;br /&gt;&lt;br /&gt;Check my &lt;a href="http://walaapoints.blogspot.com/2009/02/introduction-to-agile-software.html"&gt;previous blog post&lt;/a&gt; about this presentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6199779443820241943?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6199779443820241943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6199779443820241943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6199779443820241943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6199779443820241943'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2009/02/agile-simplified-is-being-showcased.html' title='&quot;Agile Simplified&quot; is being showcased'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-4629078822338566271</id><published>2009-02-14T13:34:00.000-08:00</published><updated>2009-02-17T05:38:06.012-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='imagine cup'/><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='life cycle'/><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>An Introduction to Agile Software Development</title><content type='html'>Yesterday, I introduced the Agile way of Software Development to Egyptian University Students participating in &lt;a href="http://imaginecupegypt.com/"&gt;Microsoft's Imagine Cup Local Competition&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The presentation took place at Microsoft Egypt Premises.&lt;br /&gt;&lt;br /&gt;The slides are available &lt;a href="http://www.slideshare.net/Walaa_M_Atef/agile-simplified"&gt;here&lt;/a&gt;, where you can view it online (full screen if you want).&lt;br /&gt;Also downloading is enabled.&lt;br /&gt;&lt;div id="__ss_1029093" style="WIDTH: 425px; TEXT-ALIGN: left"&gt;&lt;object style="MARGIN: 0px" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=agilesimplified-1234667168819720-2&amp;amp;rel=0&amp;amp;stripped_title=agile-simplified"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=agilesimplified-1234667168819720-2&amp;rel=0&amp;stripped_title=agile-simplified" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;It's worth mentioning that &lt;a href="http://imaginecup.com/"&gt;Imagine Cup World Finals&lt;/a&gt; will be held in Egypt.&lt;br /&gt;Finally, I'd like to wish all the teams the best of luck, in the competition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-4629078822338566271?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/4629078822338566271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=4629078822338566271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/4629078822338566271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/4629078822338566271'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2009/02/introduction-to-agile-software.html' title='An Introduction to Agile Software Development'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-5541169690570267054</id><published>2008-07-07T16:29:00.001-07:00</published><updated>2008-07-07T16:37:51.095-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='trivia'/><title type='text'>Software Development Meme</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/fbouma/about.aspx"&gt;Frans Bouma&lt;/a&gt; has &lt;a href="http://weblogs.asp.net/fbouma/archive/2008/07/02/software-development-meme.aspx"&gt;passed this torch to me&lt;/a&gt;. Seems like a good opportunity to get back to blogging after some busy months of work load.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Here we go:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How old were you when you first started programming?&lt;/strong&gt;&lt;br /&gt;14 years old, that's when I bought a Yamaha &lt;a href="http://en.wikipedia.org/wiki/MSX"&gt;MSX AX-170&lt;/a&gt; (Arabized and sold by Sakhr).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I bought it for gaming, but then I discovered you can do some tricks with it by writing some lines of code called Basic &lt;span style="font-family:Wingdings;"&gt;J&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;How did you get started in programming?&lt;/strong&gt;&lt;br /&gt;There was a Basic book that came with the MSX unit, I used to try out some examples from the book and try to innovate on my own. Later on when I was at high school I was convinced by a relative of mine (Hossam Ali) who was few years older and was studying Computer Engineering and he was working as a programmer at the same time.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What was your first language?&lt;/strong&gt;&lt;br /&gt;MSX basic, but just for some silly trials, then it was Turbo C at college time. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;What was the first real program you wrote?&lt;/strong&gt;&lt;br /&gt;It depends on how you define "real". Do you mean a commercial program or one that you can proudly share with others. I'll assume the later one. &lt;/p&gt;&lt;p&gt;In fact I can't remember which was first, but either a game to shoot invading space ships before they hit the earth, or implementing Ferrari's method to solve the &lt;a href="http://en.wikipedia.org/wiki/Quartic_equation"&gt;Quartic equation&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;What languages have you used since you started programming?&lt;/strong&gt;&lt;br /&gt;I list those used in my professional career: SQL, VC++6, VB6, C#, VB.NET, JavaScript, VBScript &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;What was your first professional programming gig?&lt;/strong&gt;&lt;br /&gt;A document management system called TAM Pro, I started working on it as soon as I joined Raya Software, just after my graduation back in 2000, and I quit working on it when I left the company at 2005 &lt;span style="font-family:Wingdings;"&gt;J&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;If you knew then what you know now, would you have started programming?&lt;/strong&gt;&lt;br /&gt;Definitely, yes&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/strong&gt;&lt;br /&gt;Always be open to new ideas and to change in general. Keep yourself up-to-date with what's going on the market. Try to acquire a new experience in each project. &lt;/p&gt;&lt;p&gt;If you find yourself doing a repetitive work (donkey work), then most probably you are the one to blame. Either reuse or auto-generate (as in code generation). &lt;/p&gt;&lt;p&gt;A pop-quiz if you are a .NET developer: Have you ever heard about &lt;a href="http://www.llblgen.com/"&gt;LLBLGen Pro&lt;/a&gt;? &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;What's the most fun you've ever had … programming?&lt;/strong&gt;&lt;br /&gt;Seeing your code being used in production; serving others as a useful tool.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;So who's next?&lt;/strong&gt;&lt;br /&gt;I was going to name Frans Bouma, I've already forgotten he was the one who sent it to me. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Hosam Ali &lt;/li&gt;&lt;li&gt;Mohamed Nar &lt;/li&gt;&lt;li&gt;Sami Samir &lt;/li&gt;&lt;li&gt;Mourad Askar &lt;/li&gt;&lt;li&gt;Hazem Tourab &lt;/li&gt;&lt;li&gt;Bernard Savonet &lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-5541169690570267054?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/5541169690570267054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=5541169690570267054' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5541169690570267054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5541169690570267054'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2008/07/software-development-meme_07.html' title='Software Development Meme'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-7676173411521729498</id><published>2007-10-30T08:28:00.000-07:00</published><updated>2007-10-30T08:37:08.000-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Profiles'/><category scheme='http://www.blogger.com/atom/ns#' term='Authentication'/><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Roles'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Personalization'/><category scheme='http://www.blogger.com/atom/ns#' term='Membership'/><category scheme='http://www.blogger.com/atom/ns#' term='Providers'/><category scheme='http://www.blogger.com/atom/ns#' term='Authorization'/><title type='text'>All about ASP.NET 2.0 Security</title><content type='html'>Searching for something in the ASP.NET Membership model led me to this Scott Gu's post: &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/02/24/438953.aspx"&gt;ASP.NET 2.0 Membership, Roles, Forms Authentication, and Security Resources &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's an old post but worth referencing.&lt;br /&gt;It's a never ending ASP.NET 2.0 river of resources, it contains loads of links and references of resources for:&lt;br /&gt;Authorization &amp;amp; Authentication models.&lt;br /&gt;Membership, Roles, Profiles, Personalization &amp;amp; Providers.&lt;br /&gt;Security guidelines and how-to's.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-7676173411521729498?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/7676173411521729498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=7676173411521729498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7676173411521729498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7676173411521729498'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/10/all-about-aspnet-20-security.html' title='All about ASP.NET 2.0 Security'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-7926426742415890307</id><published>2007-07-08T03:05:00.000-07:00</published><updated>2007-07-09T01:22:14.600-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StateServer'/><category scheme='http://www.blogger.com/atom/ns#' term='InProc'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASPState'/><category scheme='http://www.blogger.com/atom/ns#' term='tempdb'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SessionID'/><category scheme='http://www.blogger.com/atom/ns#' term='Session'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>ASP.NET Session State Brief</title><content type='html'>&lt;span style="font-size:85%;"&gt;I'm writing this post to answer some people's questions about Session State storage, while this information is well known for many developers, some can find it useful. I'll try to brief things up. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br /&gt;HTTP is a stateless protocol, meaning that a Web server treats each HTTP request for a page as an independent request; the server retains no knowledge of variable values used during previous requests.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What's a Session?&lt;br /&gt;&lt;/strong&gt;A session is a time limited, user (browser) specific, logical connection to a web application.&lt;br /&gt;&lt;br /&gt;In other words, a server may treat subsequent requests, made from a specific browser/user, to web pages of the same web application, as logically placed under the same umbrella (session).&lt;br /&gt;&lt;br /&gt;This way user specific variables or properly called Session specific variables can be stored somewhere, to be available for subsequent requests.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How requests can be identified to belong to a specific session?&lt;/strong&gt;&lt;br /&gt;When a user starts a new session, or the browser sends the first request to the web application, ASP.NET starts a new session and the &lt;strong&gt;SessionID&lt;/strong&gt; for that session is sent to the browser with the response.&lt;br /&gt;Then the ASP.NET would expect the SessionID to be sent back from the browser in the subsequent requests, to tie them all under the same session.&lt;br /&gt;&lt;br /&gt;A session is considered active as long as requests continue to be made with the same SessionID value. If the time between requests for a particular session exceeds the specified time-out value in minutes, then the session is considered expired. Requests made with an expired SessionID value result in a new session being started.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How is the SessionID maintained?&lt;/strong&gt;&lt;br /&gt;That's configurable in the web application, Session ID values are transmitted between the browser and the Web server in a cookie, or in the URL if cookieless sessions are specified, as shown in the following example.&lt;br /&gt;&lt;a href="http://www.anysite.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx"&gt;&lt;span style="color:#000099;"&gt;http://www.anysite.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For the first option, it won't work if the user disables cookies in his browser.&lt;br /&gt;For the second option, session will be lost if the user re-writes the URL, removing the SessionID.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Where is the Session State stored?&lt;/strong&gt;&lt;br /&gt;That's configurable in the web application too.&lt;br /&gt;&lt;br /&gt;If enabled, Session State or Session Specific variables can be stored in the following locations:&lt;br /&gt;&lt;strong&gt;- InProc:&lt;/strong&gt; stores values in the memory of the ASP.NET worker process. It offers the fastest access to these values. However, the session data is lost when the ASP.NET worker process recycles or the IIS is restarted.&lt;br /&gt;It's not appropriate for Server Farms, where more than one web server is used, since subsequent requests can be directed to different servers.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- StateServer:&lt;/strong&gt; uses a stand-alone Microsoft Windows service (aspnet_state.exe) to store &lt;em&gt;&lt;strong&gt;serialized&lt;/strong&gt;&lt;/em&gt; session variables. This service may run on another machine, thus be shared among multiple web servers in a web farm.&lt;br /&gt;This is somehow slower than the InProc mode, due to serialization and deserialization. Especially if run on a separate machine.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- SQLServer&lt;/strong&gt;: although this is the slowest solution of all, this is used for highest reliability, since a failover clustering can be used. &lt;strong&gt;Serialization&lt;/strong&gt; is used here as in the StateServer mode.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Custom:&lt;/strong&gt; stores session state data using a custom session state store provider. You must specify the type of the session state store provider using the providers sub-element of the &lt;a onclick="javascript:Track('ctl00_LibFrame_ctl06ctl00_LibFrame_ctl35',this);" href="http://msdn2.microsoft.com/en-us/library/h6bb9cz9.aspx"&gt;sessionState&lt;/a&gt; configuration element. See &lt;a href="http://msdn2.microsoft.com/en-us/library/ms178587.aspx"&gt;Implementing a Session-State Store Provider&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;For Out-Of-Proc options &lt;em&gt;(anything but the InProc): &lt;/em&gt;&lt;br /&gt;- Make sure session variables are serializable. See &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;q312112"&gt;KB 312112&lt;/a&gt; for details.&lt;br /&gt;- Using a web farm, the Application Path of the website (For example \LM\W3SVC\2) in the IIS Metabase should be identical in all the web servers in the web farm. See &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;q325056"&gt;KB 325056&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;The following is an example of the configuration section written under [system.web] section:&lt;br /&gt;&lt;span style="color:#000099;"&gt;[sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=[username];password=[strong password]" cookieless="false" timeout="20" /]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;More on using the SQL Server option:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;To install the session state database on SQL Server, run the Aspnet_regsql.exe tool located in the following folder on your web server:&lt;br /&gt;&lt;span style="color:#000099;"&gt;[systemroot]\Microsoft.NET\Framework\versionNumber&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Supply the following information with the command:&lt;br /&gt;-The name of the SQL Server instance, using the &lt;strong&gt;-S&lt;/strong&gt; option.&lt;br /&gt;-The logon credentials for an account that has permission to create a database on SQL Server. Use the &lt;strong&gt;-E&lt;/strong&gt; option to use the currently logged-on user, or use the &lt;strong&gt;-U&lt;/strong&gt; option to specify a user ID along with the &lt;strong&gt;-P&lt;/strong&gt; option to specify a password.&lt;br /&gt;-The &lt;strong&gt;-ssadd&lt;/strong&gt; command-line option to add the session state database&lt;br /&gt;&lt;br /&gt;The Aspnet_regsql.exe tool will create a database named &lt;strong&gt;ASPState&lt;/strong&gt; containing stored procedures called from the ASP.NET to save and retrieve session state to and from the database.&lt;br /&gt;&lt;br /&gt;Session data itself is stored in the tempdb database by default, which might not be the best option, since &lt;strong&gt;tempdb&lt;/strong&gt; is cleared when the SQL Server restarts.&lt;br /&gt;&lt;br /&gt;You can optionally use the &lt;strong&gt;-sstype&lt;/strong&gt; option to change the storage location of session data.&lt;br /&gt;&lt;br /&gt;The following are the possible values of the -sstype option:&lt;br /&gt;&lt;strong&gt;t &lt;/strong&gt;data will be stored in the SQL Server tempdb database.&lt;br /&gt;&lt;strong&gt;p&lt;/strong&gt; data will be stored in the &lt;strong&gt;ASPState&lt;/strong&gt; database instead of in the tempdb database.&lt;br /&gt;&lt;strong&gt;c&lt;/strong&gt; Stores session data in a custom database. You must also include the name of the custom database using the &lt;strong&gt;-d&lt;/strong&gt; option.&lt;br /&gt;&lt;br /&gt;For example, the following command creates a database named ASPState on a SQL Server instance named "SampleSqlServer" and specifies that session data is also stored in the ASPState database: &lt;span style="color:#000099;"&gt;aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;P.S. this turned out to be anything but a brief article, isn't it?&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;References:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;.NET Framework Developer's Guide: &lt;a href="http://msdn2.microsoft.com/en-us/library/87069683(vs.71).aspx"&gt;Session State&lt;/a&gt;&lt;br /&gt;ASP.NET: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms178581.aspx"&gt;Session State Overview&lt;/a&gt;&lt;br /&gt;Nothin' but ASP.NET: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms972429.aspx"&gt;ASP.NET Session State&lt;/a&gt;&lt;br /&gt;ASP.NET: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms178586.aspx"&gt;Session-State Modes &lt;/a&gt;&lt;br /&gt;.NET Framework General Reference: &lt;a href="http://msdn2.microsoft.com/en-us/library/h6bb9cz9(vs.71).aspx"&gt;sessionState &lt;sessionstate&gt;Element&lt;/a&gt;&lt;br /&gt;INFO: &lt;a href="http://support.microsoft.com/kb/307598"&gt;ASP.NET State Management Overview&lt;/a&gt;&lt;br /&gt;Peter A. Bromberg: &lt;a href="http://www.eggheadcafe.com/articles/20021016.asp"&gt;ASP.NET Session State FAQ&lt;/a&gt;&lt;br /&gt;ASP.NET Technical Articles: &lt;a href="http://msdn2.microsoft.com/en-us/library/aa478952.aspx"&gt;Session State Providers&lt;/a&gt;&lt;br /&gt;ASP.NET: &lt;a href="http://msdn2.microsoft.com/en-us/library/ms178201.aspx"&gt;Securing Session State&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-7926426742415890307?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/7926426742415890307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=7926426742415890307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7926426742415890307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7926426742415890307'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/07/aspnet-session-state-brief.html' title='ASP.NET Session State Brief'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6892371030576509707</id><published>2007-06-24T03:22:00.000-07:00</published><updated>2009-06-27T13:00:16.806-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Deploying Crystal Reports - Visual Studio 2005</title><content type='html'>As you already might know, a free version of Crystal Reports is installed/bundled with Visual Studio 2005.&lt;br /&gt;&lt;br /&gt;Now to deploy an application that uses Crystal Reports, the resources on the internet suggests using one of the following methods to deploy the Crystal Reports redistributable package.&lt;br /&gt;&lt;br /&gt;1- Using &lt;strong&gt;&lt;span style="color:#000000;"&gt;Crystal Reports for .NET Framework 2.0 Windows Installer:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Which I failed to find online, even on the Business Objects online downloads section, but doing a complete search for &lt;span style="color:#000099;"&gt;"CR*.msi"&lt;/span&gt; on my hard disk, I managed to find it on the following path:&lt;br /&gt;&lt;span style="color:#000099;"&gt;[Microsoft Visual Studio 8 Install Folder]\SDK\v2.0\BootStrapper\Packages\CrystalReports\&lt;strong&gt;CRRedist2005_x86.msi&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;2- Using &lt;strong&gt;Merge Modules:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;For which you should create a setup project for your application and in there, you should right-click the setup project node in the Solution Explorer, and select "Add Merge Module", and browse to the following path: &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;[Windows Root Drive]\Program Files\Common Files\Merge Modules\&lt;strong&gt;CrystalReportsRedist2005_x86.msm&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;This most probably won't be found on your machine!! &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;I wonder why this merge module wasn't installed with Crystal Reports.&lt;/span&gt;&lt;br /&gt;So what you need to do is to go to the &lt;a href="http://support.businessobjects.com/downloads/merge_modules.asp"&gt;Business Objects download site&lt;/a&gt;, download this file and put it where it should have been put (in the above path).&lt;br /&gt;Now build your setup project, and Crystal Reports run-times will be installed with your application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6892371030576509707?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6892371030576509707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6892371030576509707' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6892371030576509707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6892371030576509707'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/06/deploying-crystal-reports-visual-studio.html' title='Deploying Crystal Reports - Visual Studio 2005'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-4470596505357946594</id><published>2007-06-13T00:50:00.000-07:00</published><updated>2008-09-23T08:16:08.172-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OracleConnection'/><category scheme='http://www.blogger.com/atom/ns#' term='LLBLGen Pro'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Provider'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle.DataAccess'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='ODP.NET'/><title type='text'>ODP.NET &amp; LLBLGen Pro</title><content type='html'>Using LLBLGen Pro as your Data Access solution for an Oracle Database, you either have to use &lt;em&gt;Microsoft's Provider For Oracle&lt;/em&gt;, or &lt;em&gt;Oracle Data Provider for .NET (aka ODP.NET)&lt;/em&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;And both of them work on top of Oracle Client. So an Oracle Client is needed for any of the above providers, which is installed automatically when you install the ODP.NET.&lt;br /&gt;&lt;br /&gt;Many .NET developers favors the ODP.NET over the MS provider, especially those with a long track dealing with Oracle database. Because the MS provider has some limitations (lacking the support of some Oracle Native DataTypes, eg. XMLType).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using LLBLGen Pro with the ODP.NET:&lt;/strong&gt;&lt;br /&gt;When you build the code generated by LLBLGen Pro on the Development machine, it references the Oracle.DataAccess.dll version found on your machine.&lt;br /&gt;(Oracle.DataAccess.dll is the Oracle Data Provider assembly)&lt;br /&gt;&lt;br /&gt;Also it's worth noting that the "SD.LLBLGen.Pro.DQE.OracleX.NET20.dll" the Dynamic Query Engine shipped with LLBLGen Pro, and referenced in the generated code, was built against a specific version of the Oracle.DataAccess.dll (eg. SD.LLBLGen.Pro.DQE.Oracle10g.NET20.dll was built against Oracle.DataAccess.dll v.9.2.0.401 as far as I can remember).&lt;br /&gt;&lt;br /&gt;This shouldn't cause any problems in most of the cases, since installing the ODP.NET installs some Publisher Policy files that redirect calls to older versions of the Oracle.DataAccess.dll to the newer installed version.&lt;br /&gt;I said most of the cases because some older versions of the ODP.NET missed those publisher policy files. If this is the case you may include the assembly redirections into your app.config /web.config file, which should look like the following:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#000099;"&gt;[configuration]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;        [runtime]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;                [assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;                        [dependentAssembly]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;                                [assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;                                [bindingRedirect oldVersion="9.2.0.20-9.2.0.420" newVersion="9.2.0.700"/]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;                        [/dependentAssembly]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;                [/assemblyBinding]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;        [/runtime]&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;[/configuration] &lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;(Replace the square brackets with the triangular ones used for xml.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note: Assembly redirection can work the other way around, you can re-direct calls to a new version of the Oracel.DataAccess to an older installed version.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ODP.NET Versioning Schema:&lt;/strong&gt;&lt;br /&gt;It's worth mentioning here that Oracle have changed the ODP.NET / Oracle.DataAccess versioning schema.&lt;br /&gt;Starting with 10.2.0.2, Oracle Data Provider for .NET ships with two sets of binaries; one set for .NET Framework 1.x and another for .NET Framework 2.0.&lt;br /&gt;&lt;br /&gt;For example, if the ODP.NET product version number is 10.2.0.2.10, the correspondingODP.NET assembly versions are:&lt;br /&gt;■ .NET Framework 1.x version: 1.102.2.10&lt;br /&gt;■ .NET Framework 2.0 version: 2.102.2.10&lt;br /&gt;&lt;br /&gt;Note that the Oracle installer and documentation still refer to the ODP.NET product version number and not the assembly/DLL version number. As with the .NET Framework system libraries, the first digit of the assembly version number indicates the version of the .NET Framework to use with an ODP.NET assembly. Publisher Policy DLL is provided as before so that applications built with older version of ODP.NET are redirected to the newer ODP.NET assembly.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Problems:&lt;/strong&gt;&lt;br /&gt;Problems can rise when you deploy your application on a machine with a different version of the ODP.NET, then you might see the following exception:&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Could not load file or assembly 'Oracle.DataAccess, Version=x.x.x.x, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;This should be solved by a correct assembly redirection. (From the version you see in the exception to the version already installed).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another exception you might see is:&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;The Provider is not compatible with the version of the Oracle Client.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;An assembly re-direction should solve this issue, too. This shows up when you have different version of the Oracle.DataAccess.dll in your machine check the Global Assembly Cash (GAC).&lt;/span&gt;&lt;br /&gt;Due to older installations or so, while only one of them is corresponding to the latest installed version of the ODP.NET, yet your application references an older one. The first exception won't show up, since your application can find the dll, thanks to the GAC, but it's not the one that should be used.&lt;br /&gt;&lt;br /&gt;Just to make sure which ODP.NET version is installed on your machine, check the following registry path &lt;span style="color:#000099;"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In most of the cases the assembly re-direction are the answers.&lt;br /&gt;&lt;br /&gt;In some rare cases after getting rid of the re-directions issue you might see the following exception:&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Unable to cast object of type 'Oracle.DataAccess.Client.OracleConnection' to type 'Oracle.DataAccess.Client.OracleConnection'&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Pretty weird!!&lt;/span&gt;&lt;br /&gt;This can be caused by some calls to the Oracle.DataAccess.dll inside the SD.LLBLGen.Pro.DQE.OracleX.NET20.dll which were not successfully re-directed to the installed version.&lt;br /&gt;To solve this issue you will have to re-build the DQE dll to reference the same version of the Oracle.DataAccess.dll found on your development machine.&lt;br /&gt;Details can be found in this post:&lt;br /&gt;&lt;a href="http://www.llblgen.com/tinyforum/Messages.aspx?ThreadID=9007&amp;amp;StartAtMessage=0&amp;amp;#51587"&gt;http://www.llblgen.com/tinyforum/Messages.aspx?ThreadID=9007&amp;amp;StartAtMessage=0&amp;amp;#51587&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-4470596505357946594?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/4470596505357946594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=4470596505357946594' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/4470596505357946594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/4470596505357946594'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/06/odpnet-llblgen-pro.html' title='ODP.NET &amp; LLBLGen Pro'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-5326084804017985665</id><published>2007-06-04T01:54:00.000-07:00</published><updated>2007-06-04T02:12:08.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='Exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='OWA'/><title type='text'>OWA Issue on Vista</title><content type='html'>&lt;strong&gt;The Symptoms:&lt;/strong&gt;&lt;br /&gt;If you are using Outlook Web Access (OWA) on a Windows Vista, to access Exchange Server 2000/2003 , you may find yourself unable to edit any e-mail message.&lt;br /&gt;i.e . Not able to write any new e-mails nor reply to any e-mail.&lt;br /&gt;(You will see a small red 'x' instead of the editor area).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Cause:&lt;/strong&gt;&lt;br /&gt;Microsoft has removed the DHTML Editing ActiveX Control (the control that enables you to edit nice rich text with html capabilities) from Windows Vista for security reasons.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Resolution:&lt;/strong&gt;&lt;br /&gt;Ask your Exchange Admin or whoever is in charge to install the &lt;a href="http://support.microsoft.com/kb/911829"&gt;KB911829&lt;/a&gt; patch for the exchange server. This patch installs a new iFrame Editor instead of the ActiveX one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-5326084804017985665?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/5326084804017985665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=5326084804017985665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5326084804017985665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5326084804017985665'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/06/owa-issue-on-vista.html' title='OWA Issue on Vista'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-7912092294828100027</id><published>2007-05-28T04:27:00.000-07:00</published><updated>2007-05-28T05:35:40.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>Real World ASP.NET 2.0 GridView</title><content type='html'>I have posted earlier on how to &lt;a href="http://walaapoints.blogspot.com/2007/05/inserting-from-aspnet-gridview.html"&gt;Insert from a GridView&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Matt Dotson has some nice ideas for a &lt;strong&gt;Real World GridView&lt;/strong&gt;:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/mattdotson/articles/490868.aspx"&gt;Bulk Editing&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/mattdotson/articles/541795.aspx"&gt;Two Headed &amp; Grouping GridViews&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/mattdotson/archive/2006/03/02/real-world-gridview-excel-like-frozen-headers-for-asp-net-2-0.aspx"&gt;Excel-like Frozen Headers for ASP.NET 2.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-7912092294828100027?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/7912092294828100027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=7912092294828100027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7912092294828100027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7912092294828100027'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/05/bulk-edit-in-aspnet-20-gridview.html' title='Real World ASP.NET 2.0 GridView'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-3969628172155336860</id><published>2007-05-28T03:06:00.000-07:00</published><updated>2007-05-28T03:12:31.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Data'/><title type='text'>ASP.NET 2.0 Data tutorials</title><content type='html'>My previous post was about how to Insert from a ASP.NET 2.0 GridView, and the tutorial linked was one of other ASP.NET 2.0 Data Tutorials posted by Scott Mitchell&lt;br /&gt;&lt;br /&gt;In case you haven't came across these tutorials, here they are:&lt;br /&gt;&lt;a href="http://www.asp.net/Learn/DataAccess/"&gt;http://www.asp.net/Learn/DataAccess/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Good Work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-3969628172155336860?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/3969628172155336860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=3969628172155336860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/3969628172155336860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/3969628172155336860'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/05/aspnet-20-data-tutorials.html' title='ASP.NET 2.0 Data tutorials'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-1757789872224234929</id><published>2007-05-28T02:54:00.000-07:00</published><updated>2007-05-28T03:05:50.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>Inserting from the ASP.NET GridView</title><content type='html'>Scott Mitchel, has this nice idea of using the footer or a GridView as an inserting panel, Since the GridView already misses the inserting functionality, unlike the FormView or the DetailsView.&lt;br /&gt;&lt;br /&gt;Here is the tutorial:&lt;br /&gt;&lt;a href="http://www.asp.net/Learn/DataAccess/tutorial53vb.aspx?tabid=63"&gt;http://www.asp.net/Learn/DataAccess/tutorial53vb.aspx?tabid=63&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And he has a follow-up post on his blog to handle the case when the GridView has no rows!!&lt;br /&gt;In this case the GridView unlike the old DataGrid won't display the footer nor the header...oops, (they should have gave us the option here) anyway, the workaround is to use the EmptyDataTemplate to put some controls (a DetailsView is a good option), and here are the full details:&lt;br /&gt;&lt;a href="http://scottonwriting.net/sowblog/posts/11904.aspx"&gt;http://scottonwriting.net/sowblog/posts/11904.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-1757789872224234929?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/1757789872224234929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=1757789872224234929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/1757789872224234929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/1757789872224234929'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/05/inserting-from-aspnet-gridview.html' title='Inserting from the ASP.NET GridView'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-6131635529747056135</id><published>2007-03-20T06:30:00.000-07:00</published><updated>2007-03-20T06:32:37.742-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development ASP.NET Web Site Standards'/><title type='text'>Building ASP.NET 2.0 Web Sites Using Web Standards</title><content type='html'>&lt;strong&gt;Summary:&lt;/strong&gt; Microsoft ASP.NET 2.0 has many features to help you design and build Web sites that are compliant with XHTML and accessibility standards. This article looks at how and why you should be building these standards-compliant sites. (78 printed pages)&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa479043.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa479043.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-6131635529747056135?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/6131635529747056135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=6131635529747056135' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6131635529747056135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/6131635529747056135'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/03/building-aspnet-20-web-sites-using-web.html' title='Building ASP.NET 2.0 Web Sites Using Web Standards'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-5325343382957001327</id><published>2007-03-19T16:05:00.000-07:00</published><updated>2007-03-19T16:10:25.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Arabic'/><category scheme='http://www.blogger.com/atom/ns#' term='Hijri'/><title type='text'>Hijri Calendar Support in Microsoft Products</title><content type='html'>&lt;p&gt;It's all in here:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/middleeast/msdn/ArabicCalendar.aspx"&gt;http://www.microsoft.com/middleeast/msdn/ArabicCalendar.aspx&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-5325343382957001327?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/5325343382957001327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=5325343382957001327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5325343382957001327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/5325343382957001327'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/03/hijri-calendar-support-in-microsoft.html' title='Hijri Calendar Support in Microsoft Products'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1903994502805233077.post-7563616992895630849</id><published>2007-02-15T14:56:00.000-08:00</published><updated>2007-08-20T10:18:01.822-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='infopath'/><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Custom Workflow with Visual Studio 2005 for SharePoint 2007, Part 1</title><content type='html'>&lt;span style="font-size:85%;color:#000000;"&gt;The following series of posts are a compilation of different resources (blogs, MSDN, TechEd...etc).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#000099;"&gt;&lt;strong&gt;Software Requirements:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;1- Windows Server 2003 R2&lt;br /&gt;2- Microsoft .NET framework 3.0&lt;br /&gt;3- Microsoft Office InfoPath 2007&lt;br /&gt;4- Microsoft Windows Sharepoint Services 3.0&lt;br /&gt;5- Office SharePoint Server 2007 basic installation&lt;br /&gt;6- Visual Studio 2005 with SP1&lt;br /&gt;7- Visual Studio 2005 Extensions for Windows Workflow Foundation&lt;br /&gt;8- Office Sharepoint Server 2007 SDK + ECM starter Kit&lt;br /&gt;&lt;br /&gt;Note: The Office SharePoint Server 2007–specific workflow activities require that Microsoft Windows SharePoint Services 3.0 and Office SharePoint Server 2007 be installed on the computer you use to develop the workflows&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#000099;"&gt;&lt;a href="http://4.bp.blogspot.com/_VOh7_aIN0Oc/RdWCF-x5gPI/AAAAAAAAAAM/8kcfzHNqHyc/s1600-h/sp_pic1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5032071197919641842" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_VOh7_aIN0Oc/RdWCF-x5gPI/AAAAAAAAAAM/8kcfzHNqHyc/s400/sp_pic1.JPG" border="0" /&gt;&lt;/a&gt;Workflow and Windows SharePoint Services 3.0:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;The WF runtime engine can be hosted in any Windows process. Windows SharePoint Services 3.0 takes advantage of this, acting as a host for this engine. One or more workflow templates, each containing the code that defines a particular workflow, can be installed on a server. Once this is done, an association can be created between a specific template and a document library, list, or content type. This template can then be loaded and executed by the Windows SharePoint Services-hosted WF runtime engine, creating a workflow instance. The figure below shows how this looks&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#3333ff;"&gt;&lt;strong&gt;&lt;span style="color:#000099;"&gt;Sharepoint Server vs Sharepoint Services:&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;Windows SharePoint Services 3.0 offers a general foundation for human workflow applications. Office SharePoint Server 2007 provides extra capabilities built on this foundation. When is the workflow support in Windows SharePoint Services sufficient, and when is Office SharePoint Server also required? Here’s a short summary of the major factors in making this decision.&lt;br /&gt;&lt;strong&gt;Windows SharePoint Services alone is appropriate for:&lt;/strong&gt;&lt;br /&gt;· Adding application logic to Windows SharePoint Services sites that works with documents and list items.&lt;br /&gt;· Building workflow applications where user interaction via ASPX forms in a Web browser is sufficient.&lt;br /&gt;&lt;strong&gt;Office SharePoint Server is required for:&lt;/strong&gt;&lt;br /&gt;· Using most of the pre-defined workflows that Microsoft provides. (The exception is Issue Tracking, which ships with Windows SharePoint Services and uses only ASPX forms.)&lt;br /&gt;· Building workflow applications where user interaction via Office 2007 client applications is required. This option also allows using InfoPath workflow forms, which are simpler to create and provide more functionality than ASPX forms.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_VOh7_aIN0Oc/RdWC4-x5gQI/AAAAAAAAAAU/cAJxfFAR29E/s1600-h/sp_pic2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5032072074092970242" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_VOh7_aIN0Oc/RdWC4-x5gQI/AAAAAAAAAAU/cAJxfFAR29E/s400/sp_pic2.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#000099;"&gt;The roles played by different people in a workflow life cycle:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;1- &lt;strong&gt;Workflow author:&lt;/strong&gt; the developer or information worker who creates a workflow template.&lt;br /&gt;2- &lt;strong&gt;Windows SharePoint Services administrator:&lt;/strong&gt; the person who installs a workflow template and associates it with a document library or list.&lt;br /&gt;3- &lt;strong&gt;Workflow initiator:&lt;/strong&gt; the person who starts a running workflow, causing a workflow instance to be created from a particular workflow template.&lt;br /&gt;4- &lt;strong&gt;Workflow participants:&lt;/strong&gt; the people who interact with a workflow instance to carry out the business process it supports.&lt;br /&gt;&lt;br /&gt;Both installation and association are done automatically for workflows created using Office SharePoint Designer. For those created using WF Workflow Designer and Visual Studio, however, a Windows SharePoint Services server administrator must explicitly install the workflow template. Once this is done, the template must be associated with a library, list, or content type, something that can be performed by someone with lesser permissions than a server administrator. Whoever creates this association also assigns it a unique name, allowing it to be referenced by users. Optionally, the workflow’s author can let the person who creates the association set options for the workflow’s behavior, such as specifying a default list of people who should always participate in the process. The same template can be associated with multiple libraries, lists, or content types, with each association customized as required. After the association has been created and any options set, a workflow initiator can create a workflow instance from this association, as described next.&lt;br /&gt;&lt;br /&gt;There are plenty of moving parts in a Windows SharePoint Services workflow. The figure below gives an overall view of how the process works.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#000099;"&gt;&lt;strong&gt;Visual Studio 2005 vs SharePoint Designer 2007:&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-size:100%;color:#000000;"&gt;ref. &lt;a href="http://blogs.msdn.com/scaravajal/archive/2006/11/13/sharepoint-2007-workflow-jumpstart.aspx"&gt;SharePoint 2007 Workflow Jumpstart&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5032497546438213986" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_VOh7_aIN0Oc/RdcF2ux5gWI/AAAAAAAAABg/1DozhGhQp9Y/s400/VSvsSPD.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#000099;"&gt;Forms in a workflow lifecycle:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;Windows SharePoint Services workflow consists of two things: the forms a workflow uses to interact with its users and the logic that defines the workflow’s behavior.&lt;br /&gt;A Windows SharePoint Services workflow can potentially display its own forms at four points in its lifecycle:&lt;br /&gt;1- &lt;strong&gt;Association:&lt;/strong&gt; When a Windows SharePoint Services administrator associates a workflow template with a particular document library or list, he might be able to set options that will apply to every workflow instance created from this association. If a workflow author chooses to allow this, she must provide a form that lets the administrator specify this information.&lt;br /&gt;2- &lt;strong&gt;Initiation:&lt;/strong&gt; The initiator of a workflow might be allowed to specify options when he starts a running instance. In the approval scenario just described, for instance, the options included specifying the list of workflow participants and defining how long each one had to complete his or her task. If a workflow allows this, its author must provide a form to allow the initiator to set these options, as shown in step 3 of the previous diagram.&lt;br /&gt;3- &lt;strong&gt;Task Completion:&lt;/strong&gt; The running workflow instance must display a form to the participants in the workflow to let them complete their task. Shown in step 6 in the previous diagram, this form is what allowed the approvers in the earlier scenario to make comments on the document and indicate their approval or rejection.&lt;br /&gt;4- &lt;strong&gt;Modification:&lt;/strong&gt; Although it wasn’t shown in the scenario above, the creator of a workflow can allow it to be modified while it’s running. For example, a workflow might allow adding new participants after it has begun executing or extending the due date for completing tasks. If this option is used, the workflow must display a form at this point to let a participant specify what changes should be made.&lt;br /&gt;&lt;br /&gt;Workflows built solely on Windows SharePoint Services define their forms as ASPX pages, while those using Office SharePoint Server can also use forms created with InfoPath.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#000099;"&gt;The most important Activities available for designing a workflow are:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;· &lt;strong&gt;OnWorkflowActivated:&lt;/strong&gt; every Windows SharePoint Services workflow must begin with this activity. Among other things, this activity can accept information supplied by the administrator via the Association form when the workflow is associated with a document library or list. It can also accept information supplied via the Initiation form when the workflow is started.&lt;br /&gt;· &lt;strong&gt;CreateTask:&lt;/strong&gt; creates a task assigned to a particular user in a task list.&lt;br /&gt;· &lt;strong&gt;OnTaskChanged:&lt;/strong&gt; accepts information from the Task Completion form.&lt;br /&gt;· &lt;strong&gt;CompleteTask:&lt;/strong&gt; marks a task as completed.&lt;br /&gt;· &lt;strong&gt;DeleteTask:&lt;/strong&gt; removes a task from a task list.&lt;br /&gt;· &lt;strong&gt;OnWorkflowModified: &lt;/strong&gt;accepts information from the Modification form, which can then be used to change how this instance of the workflow behaves. If the workflow’s creator chooses not to include any instances of this activity in the workflow, that workflow cannot be modified while it’s running.&lt;br /&gt;· &lt;strong&gt;SendEmail:&lt;/strong&gt; sends email to a specified person or group of people.&lt;br /&gt;· &lt;strong&gt;LogToHistoryList:&lt;/strong&gt; writes information about the workflow’s execution to a history list. The information in this list is used to let users see where a workflow is in its execution, look at the workflow’s history after it’s completed, and more. To allow this kind of monitoring, the workflow’s author must write information to a History list at appropriate points in the workflow’s execution. Because it provides its own mechanism for tracking workflows, Windows SharePoint Services doesn’t support WF’s standard tracking service.&lt;br /&gt;&lt;br /&gt;A typical pattern for a simple Windows SharePoint Services workflow begins with an OnWorkflowActivated activity, and then uses a CreateTask activity to assign a task to a participant in the workflow. The BAL’s standard while activity might then be used to wait until the user completes the task. To learn when this has happened (perhaps the user makes multiple changes to the task, then checks a box on the Task Completion form when she’s done), an OnTaskChanged activity executes within the while, extracting whatever information the user has entered on that form. When the user has completed the task, a CompleteTask activity might execute, followed by a DeleteTask. The workflow can then go on to the next participant, using CreateTask to assign a task to him, and so on. And of course, other things can occur, such as sending email, logging information to the history list, or even including the BAL’s Code activity, which allows running arbitrary code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1903994502805233077-7563616992895630849?l=walaapoints.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://walaapoints.blogspot.com/feeds/7563616992895630849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1903994502805233077&amp;postID=7563616992895630849' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7563616992895630849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1903994502805233077/posts/default/7563616992895630849'/><link rel='alternate' type='text/html' href='http://walaapoints.blogspot.com/2007/02/custom-workflow-with-visual-studio-2005.html' title='Custom Workflow with Visual Studio 2005 for SharePoint 2007, Part 1'/><author><name>Walaa M Atef</name><uri>http://www.blogger.com/profile/06363479613124463966</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_VOh7_aIN0Oc/Szi1LCkmwQI/AAAAAAAAAFA/ck1LYGEMPrs/S220/walaa.bmp'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_VOh7_aIN0Oc/RdWCF-x5gPI/AAAAAAAAAAM/8kcfzHNqHyc/s72-c/sp_pic1.JPG' height='72' width='72'/><thr:total>5</thr:total></entry></feed>
