{"id":459,"date":"2008-01-05T02:33:17","date_gmt":"2008-01-05T07:33:17","guid":{"rendered":"http:\/\/blogs.devhorizon.com\/reza\/?p=459"},"modified":"2010-04-10T12:54:58","modified_gmt":"2010-04-10T17:54:58","slug":"spwebconfigmodifications-top-6-issues","status":"publish","type":"post","link":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/","title":{"rendered":"SPWebConfigModification&#8217;s Top 6 Issues"},"content":{"rendered":"<p>Configuration API introduced in .NET 2.0 gave us whole bunch of options to read and update configuration files such web.config and machine.config files. A very useful framework if you want to dynamically interact with configuration files as they apply to your web applications. <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/system.web.configuration.webconfigurationmanager.aspx\">WebConfigurationManager<\/a> possesses all the knowledge of the web.config object model and provides full access to it. The Question is : Can I use this API to access and change web.config files associated with my SharePoint apps? Yes , you certainly can, but you have to keep track of the changes , support the ability to roll them back and more importantly in a farm installation where your app is scaled across multiple web front end servers , your code should be able to reach out to those servers and apply changes (Add\/Delete\/Update). Although it is not impossible to do it this way, it&#8217;s simply more convenient if WSS Object Model could take care of this for us.<\/p>\n<p>Conveniently, WSS object model offers a new class this time around which allows your code (that is within your Feature event receivers , console apps or custom installation applications) to dynamically make and propagate changes to web.config files across your farm using <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/microsoft.sharepoint.administration.spwebconfigmodification.aspx\">SPWebConfigModification<\/a> class (Microsoft.SharePoint.Administration namespace). You have the option to add\/modify\/delete sections, child elements and attributes with some limitations and through many workarounds! We will take a look at some of the issues and workarounds (if there is any:)) in this post.<!--more--><\/p>\n<p><strong>1)<\/strong> SPWebConfigModification is poorly documented. For example, <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/microsoft.sharepoint.administration.spwebconfigmodification.name.aspx\">SPWebConfigModification.Name<\/a> property or <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms409139.aspx\">name<\/a> parameter used in SPWebConfigModification constructor are *NOT* really the names. As Daniel Larson mentions in the community content of this <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/microsoft.sharepoint.administration.spwebconfigmodification.aspx\">page<\/a>, SPWebConfigModification.Name property or name parameter in SPWebConfigModification constructor are relative xpaths to the modification. It is very important that you properly set them while adding your modification otherwise when deleting , they won&#8217;t be located and removed. WSS engine uses <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/microsoft.sharepoint.administration.spwebconfigmodification.path.aspx\">Path<\/a> property (xpath to the root node for modification) along with <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/microsoft.sharepoint.administration.spwebconfigmodification.name.aspx\">Name<\/a> Property (xpath to the child node from the root node) to delete a modification.<\/p>\n<table style=\"width: 100%\">\n<tr>\n<td>\n<p align=\"center\"><img decoding=\"async\" src=\"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/010508-0733-spwebconfig11.png\" \/><\/p>\n<\/td>\n<\/tr>\n<\/table>\n<p>The following code snippets will add the connection string , but there is NO way that you can delete it.<\/p>\n<p>[CSharp]<br \/>\nSPWebApplication webApp = SPWebApplication.Lookup(new Uri(&#8220;http:\/\/litware&#8221;));<br \/>\nSPWebConfigModification mod = new SPWebConfigModification(&#8220;JustaName&#8221;, &#8220;configuration\/connectionStrings&#8221;);<br \/>\nmod.Owner = &#8220;AnOwner&#8221;;<br \/>\nmod.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;<br \/>\nmod.Value = String.Format(&#8220;<add name=\"\\\"{0}\\\"\" connectionString=\"\\\"{1}\\\"\" providerName=\"\\\"{2}\\\"\"><\/add>&#8220;, &#8220;MyConnectionString&#8221;, &#8220;connstring goes here&#8221;, &#8220;provider goes here&#8221;);<br \/>\nwebApp.WebConfigModifications.Add(mod);<br \/>\nwebApp.Update();<br \/>\nwebApp.Farm.Services.GetValue<spwebservice><\/spwebservice>().ApplyWebConfigModifications();<br \/>\n[\/CSharp]<\/p>\n<p>OR<\/p>\n<p>[CSharp]<br \/>\nSPWebApplication webApp = SPWebApplication.Lookup(new Uri(&#8220;http:\/\/litware&#8221;));<br \/>\nSPWebConfigModification mod = new SPWebConfigModification();<br \/>\nmod.Name=&#8221;JustaName&#8221;;<br \/>\nmod.Path=&#8221;configuration\/connectionStrings&#8221;;<br \/>\nmod.Owner = &#8220;AnOwner&#8221;;<br \/>\nmod.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;<br \/>\nmod.Value = String.Format(&#8220;<add name=\"\\\"{0}\\\"\" connectionString=\"\\\"{1}\\\"\" providerName=\"\\\"{2}\\\"\"><\/add>&#8220;, &#8220;MyConnectionString&#8221;, &#8220;connstring goes here&#8221;, &#8220;provider goes here&#8221;);<br \/>\nwebApp.WebConfigModifications.Add(mod);<br \/>\nwebApp.Update();<br \/>\nwebApp.Farm.Services.GetValue<spwebservice><\/spwebservice>().ApplyWebConfigModifications();<br \/>\n[\/CSharp]<\/p>\n<p>The following code snippets will add the connection string and will remove it later on.<br \/>\n<strong>Add:<\/strong><\/p>\n<p>[CSharp]<br \/>\nSPWebApplication webApp = SPWebApplication.Lookup(new Uri(&#8220;http:\/\/litware&#8221;));<br \/>\nSPWebConfigModification mod = new SPWebConfigModification(&#8220;add[@name=\\&#8221;MyConnectionString\\&#8221;]&#8221;, &#8220;configuration\/connectionStrings&#8221;);<br \/>\nmod.Owner = &#8220;AnOwner&#8221;;<br \/>\nmod.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;<br \/>\nmod.Value = String.Format(&#8220;<add name=\"\\\"{0}\\\"\" connectionString=\"\\\"{1}\\\"\" providerName=\"\\\"{2}\\\"\"><\/add>&#8220;, &#8220;MyConnectionString&#8221;, &#8220;connstring goes here&#8221;, &#8220;provider goes here&#8221;);<br \/>\nwebApp.WebConfigModifications.Add(mod);<br \/>\nwebApp.Update();<br \/>\nwebApp.Farm.Services.GetValue<spwebservice><\/spwebservice>().ApplyWebConfigModifications();<br \/>\n[\/CSharp]<br \/>\n<strong>Delete:<\/strong><\/p>\n<p>[CSharp]<br \/>\nSPWebConfigModification configModFound = null;<br \/>\nSPWebApplication webApp = SPWebApplication.Lookup(new Uri(&#8220;http:\/\/litware&#8221;));<br \/>\nCollection<spwebconfigmodification><\/spwebconfigmodification> modsCollection = webApp.WebConfigModifications;<br \/>\nfor (int i = 0; i &lt; modsCollection.Count; i++)<br \/>\n{<\/p>\n<p>if (modsCollection[i].Owner == &#8220;AnOwner&#8221; &amp;&amp; modsCollection[i].Name == &#8220;add[@name=\\&#8221;MyConnectionString\\&#8221;]&#8221;)<br \/>\nconfigModFound = modsCollection[i];<br \/>\n}<\/p>\n<p>if (configModFound != null)<br \/>\n{<br \/>\nmodsCollection.Remove(configModFound);<br \/>\nwebApp.Update();<br \/>\nwebApp.Farm.Services.GetValue<spwebservice><\/spwebservice>().ApplyWebConfigModifications();<br \/>\n}<br \/>\n[\/CSharp]<\/p>\n<p><strong>Note: <\/strong>&lt;connectionStrings&gt;&lt;\/connectionStrings&gt; must be already in your web.config before you try to add a child node (see the related link below) otherwise you get <em>&#8220;Failed to apply a web.config modification to file &#8216;configuration\/connectionStrings&#8217;. The specified node &#8216;C:\\Inetpub\\wwwroot\\wss\\VirtualDirectories\\80\\web.config&#8217; was not found in the web.config file. &#8221; . <\/em>There is even a bug in the exception message thrown by the configuration API (Read the message carefully!). it should say &#8230; specified node &#8220;configuration\/connectionStrings&#8221; and file &#8220;web.config&#8221;&#8230; not the other way around &#8230;.Anyhow!!:)<\/p>\n<p><strong>2)<\/strong> One thing I noticed that is very annoying is when a web application has been extended to other zones such as Internet, Extranet and etc. In this case modifications propagate across the farm and to all zones as expected. However when you delete the modifications , changes are ONLY applied to the default zone. You have to manually roll back the changes for other zones which really sucks! , but wait !! there is one more thing that sucks more than anything else. No matter what web application you specifiy to be the target of update operation by ApplyWebConfigModifications , it somehow overwrites all the web.config files of other web applications. No , don&#8217;t panic!! it doesn&#8217;t apply the changes to other web applications , it just somehow opens them up and save them without changeing anything, but this makes the ASP.NET watcher component to force the application pool of those sites to be restarted.<\/p>\n<p><strong>3)<\/strong>Back to issue #2. What if I want to apply my modification only to the Default and Internet zones and not to the other zones? No damn way! SPWebConfigModification doesn&#8217;t expose a property that would allow you to specify on which zone(s) you want the WebConfigModification to be applied.<\/p>\n<p><strong>4)<\/strong> If you use EnsureSection, your modifications won&#8217;t be deleted (Workaround : use EnsureChildNode instead). I have observed some issues with using EnsureChildNode for adding parent nodes such as appsettings and connectionStrings in MOSS (not WSS). If your code is meant to be executed in both platforms, make sure you completely test your modifications so your code doesn&#8217;t mess up with the Web.config files .<\/p>\n<p>[CSharp]<br \/>\nSPWebConfigModification mod = new SPWebConfigModification(&#8220;cSection&#8221;, &#8220;configuration&#8221;);<br \/>\nmod.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureSection;<br \/>\n[\/CSharp]<\/p>\n<p><strong>5)<\/strong> SPWebConfigModification CANNOT be used to add some modification types such as assembly(configuration\/system.web\/compilation\/assemblies), assemblyBinding (configuration\/runtime\/assemblyBinding -SPWebConfigModification doesn&#8217;t have a property that would allow you to specify namespace) and etc.<\/p>\n<p><strong>Note<\/strong>: SPWebConfigModification SHOULD NOT be used to add SafeControl or CAS policies to web.config files. Solution package manifests can perfectly handle these type of modifications in <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/ms413697.aspx\">SafeControls<\/a> and <a target=\"_blank\" href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa543901.aspx\">CodeAccessSecurity<\/a> Elements. The fact that the solution framework does this manipulation during deployment is a great advance so why not using it?<\/p>\n<p><strong>6)<\/strong> For some modification types and in a farm environment the following code won&#8217;t propagate your changes across the farm . Mark Wagner has <a target=\"_blank\" href=\"http:\/\/www.crsw.com\/mark\/Lists\/Posts\/Post.aspx?ID=32\">more<\/a> to tell you.<\/p>\n<p>[CSharp]<br \/>\nSPFarm.Local.Services.GetValue<spwebservice><\/spwebservice>().ApplyWebConfigModifications();<br \/>\n[\/CSharp]<\/p>\n<p>I have also observed this behavior, but I have never been able to find why. This is another dark point I found in SPWebConfigModification class &#8211; There is absolutely no explanation whatsoever . I always use the following line of code instead:<\/p>\n<p>[CSharp]<br \/>\nwebApp.Farm.Services.GetValue<spwebservice><\/spwebservice>().ApplyWebConfigModifications();<br \/>\n[\/CSharp]<\/p>\n<p><font color=\"#ff0000\"><strong>[Update: 6\/4\/2008]<\/strong> <\/font>Related Post: <a href=\"https:\/\/blogs.devhorizon.com\/reza\/?p=555\">https:\/\/blogs.devhorizon.com\/reza\/?p=555<\/a><\/p>\n<p><font color=\"#ff0000\"><strong>[Update: 4\/10\/2010]<\/strong>\u00a0 <\/font><font color=\"#000000\">Looks like, the\u00a0issue 5 is now fixed and you can add and remove assembly and assemblyBindings elements. I haven&#8217;t tested it since I wrote this blog post, but some readers left comments below and they said they could add and remove these elements.<\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Configuration API introduced in .NET 2.0 gave us whole bunch of options to read and update configuration files such web.config and machine.config files. A very useful framework if you want to dynamically interact with configuration files as they apply to your web applications. WebConfigurationManager possesses all the knowledge of the web.config object model and provides [&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-459","post","type-post","status-publish","format-standard","hentry","category-moss-2007"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SPWebConfigModification&#039;s Top 6 Issues - 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\/05\/spwebconfigmodifications-top-6-issues\/\" \/>\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=\"6 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\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/\"},\"author\":{\"name\":\"Reza Alirezaei\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#\\\/schema\\\/person\\\/cdbb24d283697a65951cb4a14e474938\"},\"headline\":\"SPWebConfigModification&#8217;s Top 6 Issues\",\"datePublished\":\"2008-01-05T07:33:17+00:00\",\"dateModified\":\"2010-04-10T17:54:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/\"},\"wordCount\":1188,\"commentCount\":47,\"image\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/010508-0733-spwebconfig11.png\",\"articleSection\":[\"MOSS 2007\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/\",\"url\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/\",\"name\":\"SPWebConfigModification's Top 6 Issues - Reza Alirezaei's Blog %\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/010508-0733-spwebconfig11.png\",\"datePublished\":\"2008-01-05T07:33:17+00:00\",\"dateModified\":\"2010-04-10T17:54: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\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/2008\\\/01\\\/05\\\/spwebconfigmodifications-top-6-issues\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/010508-0733-spwebconfig11.png\",\"contentUrl\":\"https:\\\/\\\/blogs.devhorizon.com\\\/reza\\\/wp-content\\\/uploads\\\/2008\\\/01\\\/010508-0733-spwebconfig11.png\",\"width\":496,\"height\":270},{\"@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":"SPWebConfigModification's Top 6 Issues - 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\/05\/spwebconfigmodifications-top-6-issues\/","twitter_misc":{"Written by":"Reza Alirezaei","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/#article","isPartOf":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/"},"author":{"name":"Reza Alirezaei","@id":"https:\/\/blogs.devhorizon.com\/reza\/#\/schema\/person\/cdbb24d283697a65951cb4a14e474938"},"headline":"SPWebConfigModification&#8217;s Top 6 Issues","datePublished":"2008-01-05T07:33:17+00:00","dateModified":"2010-04-10T17:54:58+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/"},"wordCount":1188,"commentCount":47,"image":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/010508-0733-spwebconfig11.png","articleSection":["MOSS 2007"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/","url":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/","name":"SPWebConfigModification's Top 6 Issues - Reza Alirezaei's Blog %","isPartOf":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/#primaryimage"},"image":{"@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/010508-0733-spwebconfig11.png","datePublished":"2008-01-05T07:33:17+00:00","dateModified":"2010-04-10T17:54: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\/05\/spwebconfigmodifications-top-6-issues\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.devhorizon.com\/reza\/2008\/01\/05\/spwebconfigmodifications-top-6-issues\/#primaryimage","url":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/010508-0733-spwebconfig11.png","contentUrl":"https:\/\/blogs.devhorizon.com\/reza\/wp-content\/uploads\/2008\/01\/010508-0733-spwebconfig11.png","width":496,"height":270},{"@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\/459","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=459"}],"version-history":[{"count":0,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/posts\/459\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/media?parent=459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/categories?post=459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.devhorizon.com\/reza\/wp-json\/wp\/v2\/tags?post=459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}