Custom Configuration Section Kullanımı

Zamanla ve kullanıcı kontrollü olarak değişebilecek olan özelliklerin configte saklanması tercih edilen hızlı bir yöntemdir.

Web.config dosyamızın içerisine, configSections elementi içerisinde sectionGroup ve section tanımlamalarını yapmamız yeterli olacaktır.

Örnek tanımlama;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 
 <configSections>
     <sectionGroup name="serviceConnectionGroupRedis">
         <section name="Redis.ServerSettings" type="ConsoleApplication1.RedisDynamic.RedisServerSettings,ConsoleApplication1"/>
     </sectionGroup>
 </configSections>
 
 <serviceConnectionGroupRedis>
     <Redis.ServerSettings DefaultDb="0" ConnectionStringOrName="localhost:6379" PreferSlaveForRead="true" />
 </serviceConnectionGroupRedis>

 <startup>
 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
 </startup>
</configuration>

C# tarafında ise section type’ta belirlenen dosya yaratılır. Bu dosya içeriğine göre config ayarlarımız yüklenmektedir.

namespace ConsoleApplication1.RedisDynamic
{
   public interface IRedisServerSettings
   {
       bool PreferSlaveForRead { get; }
       string ConnectionStringOrName { get; }
       int DefaultDb { get; }
   }


   public class RedisServerSettings : ConfigurationSection, IRedisServerSettings
   {
       public static Lazy<IRedisServerSettings> Settings = new Lazy<IRedisServerSettings>(() => ConfigurationManager.GetSection("serviceConnectionGroupRedis/Redis.ServerSettings") as RedisServerSettings);

       [ConfigurationProperty("PreferSlaveForRead", IsRequired = false, DefaultValue = false)]
       public bool PreferSlaveForRead { get { return Convert.ToBoolean(this["PreferSlaveForRead"]); } }

       [ConfigurationProperty("ConnectionStringOrName", IsRequired = true)]
       public string ConnectionStringOrName { get { return this["ConnectionStringOrName"] as string; } }
  
       [ConfigurationProperty("DefaultDb", IsRequired = false, DefaultValue = 0)]
       public int DefaultDb { get { return Convert.ToInt32(this["DefaultDb"]); } }
   }
}

Daha sonra istenilen yerde config ayarları çekilebilmektedir.

var ayarlar = ConfigurationManager.GetSection("serviceConnectionGroupRedis/Redis.ServerSettings");
//veya statik olarak type göre tanımlama yaptıysak aşağıdaki şekildede ayarlarımızı alabiliriz.
var ayar = RedisServerSettings.Settings.Value;

Visual Studio Publish exclude etme(publishte klasör ve dosya gizleme)

Bazen publish esnasında tüm dosyları canlıya geçerken hepimizin yaptığı gibi webconfig gibi db adreslerimizi ve bazı local ayarlarımızı gösteren dosyaları yanlışlıkla servera kopyalayabiliriz. Bu durumun önüne geçmek için publishten config dosyalarını gizleyebiliriz. Bunun için aşağıdaki gibi Visual Studio Projesi içerisinde\Properties\PublishProfiles\projeadi.pubxml dosyasını düzenleyebiliriz.

 

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
.......
<!--publish ile çıkarılmaması istenilen klasörleri buraya ; ile yazabiliriz -->
<ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
<!--publish ile çıkarılmaması istenilen dosyaları buraya ; ile yazabiliriz -->
<ExcludeFilesFromDeployment>LocalConnectionStrings.config;</ExcludeFilesFromDeployment> 
</PropertyGroup>
</Project>

Web Configdeki mail ayarlarını kullanma

Öncelikle Web.config dosyamızda mail ayarlarını yapıyoruz.

<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="testuser@domail.com">
<network defaultCredentials="true" host="localhost" port="25" userName="kaushal" password="testPassword"/>
</smtp>
</mailSettings>
</system.net>

Kod tarafından tanımlı mail ayarlarını ise aşağıdaki gibi alabilirsiniz.

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
MailSettingsSectionGroup settings = (MailSettingsSectionGroup)config.GetSectionGroup("system.net/mailSettings");
Response.Write("host: " + settings.Smtp.Network.Host + "<br />");
Response.Write("port: " + settings.Smtp.Network.Port + "<br />");
Response.Write("Username: " + settings.Smtp.Network.UserName + "<br />");
Response.Write("Password: " + settings.Smtp.Network.Password + "<br />");
Response.Write("from: " + settings.Smtp.From + "<br />");

Asp.net 4.0 url rewrite

Cookie vs tuttmada site adının http://www.3lma.net ile başaması veya 3lma.net  farklı bir domainmiş gibi işlem görür. Yani http://www.3lma.net de oluşturulmuş cookiye 3lma.net dan ulaşamazsınız. Bunun için ben siteye www ile yapılan girişleride 3lma.net ‘e yönlendiriyorum. Bunu yaparken karşılaştığım bir hata oldu aşağıdaki gibi.

Asp.net ile web config dosyası temizlenmiş halde geliyor url rewrite modulunu kullanırken aşağıdaki gibi bir hata ile karsılastım. Aldığım hata “The element ‘system.webServer’ has invalid child element ‘rewrite’” idi sonrasında ise hatalı ve hatasın web config dosyalarını karsılastırdgımızda sorunun <configuration xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0″> kısmından kaynaklandıgını anladım problemı cozmek için xml şema tanımını girmeniz gerekiyor.

<configuration> olması gereken

<configuration xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0″>

Yönlendirme işlemini ise;

<system.webServer>
    <rewrite>
        <rules>
            <rule name="Remove WWW prefix" >
                 <match url="(.*)" ignoreCase="true" />
                 <conditions>
                     <add input="{HTTP_HOST}" pattern="^www\.3lma\.net" />
                 </conditions>
                 <action type="Redirect" url="http://3lma.net/{R:1}" redirectType="Permanent" />
             </rule>
             <rule name="www redirect https" enabled="true" stopProcessing="true">
             <match url="(.*)" />
             <conditions>
                 <add input="{HTTP_HOST}" pattern="^www\.3lma\.net" />
                 <add input="{HTTPS}" pattern="on" />
             </conditions>
             <action type="Redirect" url="https://3lma.net/{R:1}" />
          </rule>
       </rules>
    </rewrite>
</system.webServer>