{"id":472,"date":"2008-01-11T17:46:47","date_gmt":"2008-01-11T22:46:47","guid":{"rendered":"http:\/\/blogs.devhorizon.com\/reza\/?p=472"},"modified":"2008-01-14T10:12:58","modified_gmt":"2008-01-14T15:12:58","slug":"todays-nuances","status":"publish","type":"post","link":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/","title":{"rendered":"Today&#8217;s Nuances"},"content":{"rendered":"<p>Today I was developing a custom forms based authentication provider against CRM 3.0 when I got three exceptions that led to an interesting outcome.<\/p>\n<p><strong>OS<\/strong>: Windows 2003 Enterprise Edition x64<br \/>\n<strong>IDE<\/strong>: Visual Studio 2008 RTM<br \/>\n<strong>Configuration<\/strong>: Default Zone (http:\/\/toronto1) with NTLM, Internet Zone (http:\/\/toronto1:26415) with FBA<br \/>\n<strong>Debugging<\/strong> <strong>Mode <\/strong>: Locally<br \/>\n<strong>Exception1<\/strong>: System.Threading.ThreadAbortException.<br \/>\n<strong>Exception2<\/strong>: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.<br \/>\n<strong>Exception3<\/strong>: Mixed mode debugging is not supported on Windows 64-bit platforms .<\/p>\n<p>Before I get into how I got the exceptions, let me elaborate a bit on how I was led to all this. After developing the authentication provider, I created a log in web part that authenticates the users against CRM database (using my custom auth provider) and add them to the Visitors group upon thier successful login plus some other custom actions which is beyond the scope of this post.<!--more--> In the CreateChildControls() event , I created an standard <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/system.web.ui.webcontrols.login(VS.85).aspx\" target=\"_blank\">login control<\/a> using the following code:<\/p>\n<blockquote><p>1: loginCtrl = new Login();<br \/>\n2: loginCtrl.UserNameLabelText = UserNameLabelText;<br \/>\n.<br \/>\n.<br \/>\n.<br \/>\n6: loginCtrl.LoggedIn += new EventHandler(loginCtrl_LoggedIn);<br \/>\n7: Controls.Add(loginCtrl);<\/p><\/blockquote>\n<p>Log in control exposes a helpful event called <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/system.web.ui.webcontrols.login.loggedin(VS.85).aspx\" target=\"_blank\">LoggedIn<\/a> (Line 6 above) that gives you the ability to take custom actions after the user is successfully authenticated. I went ahead and coded it as follow:<\/p>\n<blockquote><p>1. void loginCtrl_LoggedIn(object sender, EventArgs e)<br \/>\n2.    {<br \/>\n3.    \/\/Get the user from Membership provider<br \/>\n4.    MembershipUser user = Membership.GetUser(((TextBox)loginCtrl.FindControl(&#8220;UserName&#8221;)).Text);<br \/>\n5.     if (user != null)<br \/>\n6.       {<br \/>\n7.          SPWeb web = SPContext.Current.Web;<br \/>\n8.          SPGroup vGroup = web.AssociatedVisitorGroup;<br \/>\n9.          \/\/Add user to visitor group and other custom actions are removed for code brevity<br \/>\n10.         Page.Response.Redirect(Page.Request.Url.ToString());<br \/>\n11.      }<br \/>\n12.   }<\/p><\/blockquote>\n<p>While I was debugging the code (for Internet zone at http:\/\/toronto1:26415 ) and right on the line 7 , I got Exception1 and Exception2 thrown:<\/p>\n<table style=\"border-collapse: collapse\" border=\"0\">\n<tr>\n<td style=\"padding-right: 7px; padding-left: 7px\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt1.png\" style=\"width: 726px; height: 385px\" height=\"366\" width=\"746\" \/><\/td>\n<\/tr>\n<\/table>\n<p>After the execution of code in the line 7, I checked the ULS log and found &#8220;Thread was being aborted&#8221; exception there too. I have seen &#8220;System.Threading.ThreadAbortException&#8221; in other contexts (As you can see later in this post) , but never for SPWeb object (Web.AssociatedGroups). Second exception (Unable to evaluate expression because&#8230;.) which is the result of first exception makes sense though. If the thread is currently stopped somewhere outside the generated code by IL , then the rest of properties fail to be evaluated, so I have to find out why the current thread is being halted. Earlier in my web part , I had some calls into unmanaged code (Not included in this post) and the fact that many SharePoint objects (such as SPWeb) are actually thin managed wrapper over the unmanaged code made me think to debug my code in Mixed mode (Native,Managed) with the hope to nail down the issue by looking at the all of the current call stack. Default debug settings for attaching to the worker process is set to automatically determine the type of code to debug which is T-SQL code and Managed code as shown below.<\/p>\n<table style=\"border-collapse: collapse\" border=\"0\">\n<tr>\n<td style=\"padding-right: 7px; padding-left: 7px\"><img decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt2.png\" \/><\/td>\n<\/tr>\n<\/table>\n<p>I switched to mixed debug mode to target debugging for Managed and Native code:<\/p>\n<table style=\"border-collapse: collapse\" border=\"0\">\n<tr>\n<td style=\"padding-right: 7px; padding-left: 7px\"><img decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt3.png\" \/><\/td>\n<\/tr>\n<\/table>\n<p>Then  I got this error:<\/p>\n<table style=\"border-collapse: collapse\" border=\"0\">\n<tr>\n<td style=\"padding-right: 7px; padding-left: 7px\"><img decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt4.png\" \/><\/td>\n<\/tr>\n<\/table>\n<p>After some research , I was pointed to a MSDN article <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms184681.aspx\" target=\"_blank\">here<\/a> .Apparently, It is well known that mixed-mode debugging is not supported when running in 64-bit mode. Dead end path, so let&#8217;s move on! I decided to debug the code again by logging with the same credential as application pool. Guess what? I didn&#8217;t get these two exceptions when I logged in to the site with application pool identity and debugged my code. It turned out that these exceptions were hiding the true exception (&#8220;Access Denied&#8221;) and I was not paying attention to this at all. My bad&#8230;&#8230;.I ran the code with elevated privilege and everything came back to the normal life:<\/p>\n<ol>\n<li><span style=\"font-size: 10pt; color: green; font-family: Courier New\">\/\/Get the user<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">MembershipUser<\/span> user = <span style=\"color: #2b91af\">Membership<\/span>.GetUser(((<span style=\"color: #2b91af\">TextBox<\/span>)loginCtrl.FindControl(<span style=\"color: #a31515\">&#8220;UserName&#8221;<\/span>)).Text);<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: blue\">if<\/span> (user != <span style=\"color: blue\">null<\/span>)<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">  {<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0 SPWeb<\/span> webInUserContext = <span style=\"color: #2b91af\">SPContext<\/span>.Current.Web;<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0 SPSite<\/span> SiteInUserContext = <span style=\"color: #2b91af\">SPContext<\/span>.Current.Site;<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0     Guid<\/span> webGuid = webInUserContext.ID;<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0     Guid<\/span> siteGuid = SiteInUserContext.ID;<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0     SPSecurity<\/span>.RunWithElevatedPrivileges(<span style=\"color: blue\">delegate<\/span>()<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0    {<\/span><\/li>\n<li><span style=\"font-size: 10pt; color: green; font-family: Courier New\">\u00a0\u00a0    \/\/ Get the site in impersonated context<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: blue\">\u00a0    using<\/span> (<span style=\"color: #2b91af\">SPSite<\/span> site = <span style=\"color: blue\">new <\/span><span style=\"color: #2b91af\">SPSite<\/span>(siteGuid))<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0          {<\/span><\/li>\n<li><span style=\"font-size: 10pt; color: green; font-family: Courier New\">\u00a0\u00a0\u00a0            \/\/ Get the web in the impersonated context<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0\u00a0\u00a0   SPWeb<\/span> web = site.OpenWeb(webGuid);<\/span><\/li>\n<li><span style=\"font-size: 10pt; color: blue; font-family: Courier New\">\u00a0\u00a0\u00a0            try<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0\u00a0               {<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0                SPGroup<\/span> vGroup = web.AssociatedVisitorGroup;<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: green\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0                \/\/ Extra code is removed for brevity<\/span><\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Page.Response.Redirect(Page.Request.Url.ToString());<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0\u00a0 }<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: blue\">\u00a0\u00a0\u00a0\u00a0 catch<\/span> (<span style=\"color: #2b91af\">Exception<\/span> exc)<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0 {<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: #2b91af\">\u00a0\u00a0\u00a0\u00a0                TraceProvider<\/span>.WriteTrace(&#8220;bluh bluh bluh&#8221;);<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0 }<\/span><\/li>\n<li><span style=\"font-size: 10pt; color: blue; font-family: Courier New\">\u00a0\u00a0\u00a0 finally<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0 {<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\"><span style=\"color: blue\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if<\/span> (web != <span style=\"color: blue\">null<\/span>) web.Dispose();<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0\u00a0 }<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0\u00a0 }<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">\u00a0 });<\/span><\/li>\n<li><span style=\"font-size: 10pt; font-family: Courier New\">}<\/span><\/li>\n<\/ol>\n<p>wait a second!!! Exception 2 occurs again when I step through the code at the Response.Redirect (at line 20). No worries. I knew my way out this time \ud83d\ude42<\/p>\n<table style=\"border-collapse: collapse\" border=\"0\">\n<tr>\n<td style=\"padding-right: 7px; padding-left: 7px\"><img decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt5.png\" \/><\/td>\n<\/tr>\n<\/table>\n<p>This was exactly the same thing was happening above. Current thread gets aborted and you get this error message. You have three options here (depending on your code ):<\/p>\n<ol>\n<li>You can use a try-catch statement to catch this exception (as I did above)<\/li>\n<li>Sometimes If you move the redirect statement outside the block it works fine.<\/li>\n<li>Use <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa332829(VS.71).aspx\" target=\"_blank\">Response.Redirect(String url, <strong>false<\/strong>) <\/a>that bypasses the internal call to Response.End which terminates the current http thread.<\/li>\n<\/ol>\n<p>I decided to use option 3 ,so I had to replace line 20 with the following code. I also decided to keep try-catch block , becuase I am going to show you something at the end of this post.<\/p>\n<blockquote><p>Page.Response.Redirect(Page.Request.Url.ToString(), <strong>false<\/strong>);<\/p><\/blockquote>\n<p>Last but not least, I would like to draw your attention to something here. If you have noticed, I am disposing my object in the finally block. In this MSDN <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa973248.aspx\" target=\"_blank\">document<\/a> , it is said that calling Response.Redirect WILL NOT execute the finally block. Therefore, before any redirection or transfer of processing can occur, you must dispose of the objects. Well, my code here shows that finally block gets hit even after Response.Redirect!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt6.png\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today I was developing a custom forms based authentication provider against CRM 3.0 when I got three exceptions that led to an interesting outcome. OS: Windows 2003 Enterprise Edition x64 IDE: Visual Studio 2008 RTM Configuration: Default Zone (http:\/\/toronto1) with NTLM, Internet Zone (http:\/\/toronto1:26415) with FBA Debugging Mode : Locally Exception1: System.Threading.ThreadAbortException. Exception2: Unable to [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-moss-2007"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Today&#039;s Nuances - Reza Alirezaei&#039;s Blog %<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Reza Alirezaei\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/\"},\"author\":{\"name\":\"Reza Alirezaei\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#\\\/schema\\\/person\\\/cdbb24d283697a65951cb4a14e474938\"},\"headline\":\"Today&#8217;s Nuances\",\"datePublished\":\"2008-01-11T22:46:47+00:00\",\"dateModified\":\"2008-01-14T15:12:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/\"},\"wordCount\":938,\"commentCount\":14,\"image\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/011208-2246-overcomingt1.png\",\"articleSection\":[\"MOSS 2007\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/\",\"url\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/\",\"name\":\"Today's Nuances - Reza Alirezaei's Blog %\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/011208-2246-overcomingt1.png\",\"datePublished\":\"2008-01-11T22:46:47+00:00\",\"dateModified\":\"2008-01-14T15:12:58+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#\\\/schema\\\/person\\\/cdbb24d283697a65951cb4a14e474938\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/11\\\/todays-nuances\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/011208-2246-overcomingt1.png\",\"contentUrl\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/011208-2246-overcomingt1.png\",\"width\":787,\"height\":366},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#website\",\"url\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/\",\"name\":\"Reza Alirezaei's Blog\",\"description\":\"Blogging from the field!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#\\\/schema\\\/person\\\/cdbb24d283697a65951cb4a14e474938\",\"name\":\"Reza Alirezaei\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3ba940d84e0ecb909e62e93df4c56daf0395c7e53c914467ab2ee73124a7d7b6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3ba940d84e0ecb909e62e93df4c56daf0395c7e53c914467ab2ee73124a7d7b6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3ba940d84e0ecb909e62e93df4c56daf0395c7e53c914467ab2ee73124a7d7b6?s=96&d=mm&r=g\",\"caption\":\"Reza Alirezaei\"},\"url\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/author\\\/rezaa\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Today's Nuances - Reza Alirezaei's Blog %","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/","twitter_misc":{"Written by":"Reza Alirezaei","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/#article","isPartOf":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/"},"author":{"name":"Reza Alirezaei","@id":"https:\/\/blogs.devhorizon.com\/reza\/#\/schema\/person\/cdbb24d283697a65951cb4a14e474938"},"headline":"Today&#8217;s Nuances","datePublished":"2008-01-11T22:46:47+00:00","dateModified":"2008-01-14T15:12:58+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/"},"wordCount":938,"commentCount":14,"image":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt1.png","articleSection":["MOSS 2007"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/","url":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/","name":"Today's Nuances - Reza Alirezaei's Blog %","isPartOf":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/#primaryimage"},"image":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt1.png","datePublished":"2008-01-11T22:46:47+00:00","dateModified":"2008-01-14T15:12:58+00:00","author":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/#\/schema\/person\/cdbb24d283697a65951cb4a14e474938"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/11\/todays-nuances\/#primaryimage","url":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt1.png","contentUrl":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/011208-2246-overcomingt1.png","width":787,"height":366},{"@type":"WebSite","@id":"https:\/\/blogs.devhorizon.com\/reza\/#website","url":"https:\/\/blogs.devhorizon.com\/reza\/","name":"Reza Alirezaei's Blog","description":"Blogging from the field!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.devhorizon.com\/reza\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blogs.devhorizon.com\/reza\/#\/schema\/person\/cdbb24d283697a65951cb4a14e474938","name":"Reza Alirezaei","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3ba940d84e0ecb909e62e93df4c56daf0395c7e53c914467ab2ee73124a7d7b6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3ba940d84e0ecb909e62e93df4c56daf0395c7e53c914467ab2ee73124a7d7b6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3ba940d84e0ecb909e62e93df4c56daf0395c7e53c914467ab2ee73124a7d7b6?s=96&d=mm&r=g","caption":"Reza Alirezaei"},"url":"https:\/\/blogs.devhorizon.com\/reza\/author\/rezaa\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/posts\/472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/comments?post=472"}],"version-history":[{"count":0,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/posts\/472\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/media?parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/categories?post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/tags?post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}