Missing entries in user.config after decryption/encryption - c#

I like to store a username and password to the user.config in my C# .net5 program. I don't want to store the password direct and I decided to decrypt the userSettings section.
After decryption parts of the file are missing.
Orginal user.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System.Configuration.ConfigurationManager, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" >
<section name="FileUploader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System.Configuration.ConfigurationManager, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToLocalUser" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<FileUploader.Properties.Settings>
<setting name="UserName" serializeAs="String">
<value>user</value>
</setting>
<setting name="Password" serializeAs="String">
<value>xyz</value>
</setting>
</FileUploader.Properties.Settings>
</userSettings>
</configuration>
After encryption:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System.Configuration.ConfigurationManager, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" >
<section name="FileUploader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System.Configuration.ConfigurationManager, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToLocalUser" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<FileUploader.Properties.Settings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA4LmAfRMCHUeURwT1gTPd8AQAAAACAAAAAAAQZgAAAAEAACAAAADnR+uFolwsH4gkWI6vd46HNUxBv7ZfrQJmHe0q/zz8jAAAAAAOgAAAAAIAACAAAABlvfcY6M7JdG2dKIXO7cUUO9ui3Nou40CjMolKyJW7zgACAAAL5H+KJFPGoyugYYFDkZsV7GjXoaO+r8/z01/OiqVYXw80dCUIKje2g0tgizNrB/rAUmSg/uDPBx1yj3TAJ5aXf+fRxJaspf1jjr+QIaSJShnpy1sEjjpbUUn9+BVCYSJH8d4Ysj2JP1wvM5mgFBlFUcCLhHO+FputK3XpihAZCXeOddjNw2xYIQu4pmenLBiW6+fRUpINmNan/exQvHOWfwXuoZvqUli1hv+29qTuh/eJuPJQoyQSKrZ1A6Ie8aG2dsgQDvnVFEkt8cChkTn/TIc2Dk1uSDrsIYj/Ah8g1T5bE3PvWAYv67vtEfKbwBrqig+3HOSltZayVWyd2Y7iDS15Qk763ipiaBM64zhs/g4koQWpH1kAkfqgW3ibYAJEsk1a/K0Dd1Q2muxo0fsk1DfNYJIhFS8eAIuABlF6NAF5AT5hYyIOWVGjaquEP/aqzepCjEwkoLgD003qMISK7W6EAugSbWCRTwcMcKxZD3tHTmNLzZk+g8C7XpaWOk0xyODi5+mVXI8zg7NIGYo34JPado8l0p0Qd0gx15PwtZNHj0k9o6rieTgWjJEqf52ng70DNySsSX3jfyW91ArslcMLqO1qpbSFuIt0LeIswSxoR/etNM+GoGUjRW7t1OKGLcV5Wi8k0QdheXhxo6Hvq2/nv9iFYJxqgwoN6v1N0kAAAAACcCtrS9KBGCutdHdYddlimN5cPb8+X/snuKEgu63fi4TE2VSei4R0WqjeC22JIFn3HqPIzWb9Kd9pPDJCWQz7</CipherValue>
</CipherData>
</EncryptedData>
</FileUploader.Properties.Settings>
</userSettings>
</configuration>
After decryption:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System.Configuration.ConfigurationManager, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" >
<section name="FileUploader.Properties.Settings" type="System.Configuration.ClientSettingsSection, System.Configuration.ConfigurationManager, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToLocalUser" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<FileUploader.Properties.Settings>
<setting name="" serializeAs="String">
<value>xyz</value>
</setting>
</FileUploader.Properties.Settings>
</userSettings>
</configuration>
There is only the last entry and the name of the entry is missing. If I switch the order in the original file, I get "user" as the value.
The code to decrypt/encrypt (more or less a copy of an msdn example):
private void ProtectSettings()
{
// Get the application configuration file.
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
// Define the Rsa provider name.
string provider = "DataProtectionConfigurationProvider";
string section = "userSettings/" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Properties.Settings";
// Get the section to protect.
ConfigurationSection connStrings = config.GetSection(section);
if (connStrings != null)
{
if (!connStrings.SectionInformation.IsProtected)
{
if (!connStrings.ElementInformation.IsLocked)
{
// Protect the section.
connStrings.SectionInformation.ProtectSection(provider);
connStrings.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
Debug.WriteLine("Section {0} is now protected by {1}",
connStrings.SectionInformation.Name,
connStrings.SectionInformation.ProtectionProvider.Name);
}
else
Debug.WriteLine(
"Can't protect, section {0} is locked",
connStrings.SectionInformation.Name);
}
else
Debug.WriteLine(
"Section {0} is already protected by {1}",
connStrings.SectionInformation.Name,
connStrings.SectionInformation.ProtectionProvider.Name);
}
else
Debug.WriteLine("Can't get the section {0}", section);
}
private static void UnProtectSettings()
{
// Get the application configuration file.
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
string section = "userSettings/" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Properties.Settings";
// Get the section to unprotect.
ConfigurationSection connStrings = config.GetSection(section);
if (connStrings != null)
{
if (connStrings.SectionInformation.IsProtected)
{
if (!connStrings.ElementInformation.IsLocked)
{
// Unprotect the section.
connStrings.SectionInformation.UnprotectSection();
connStrings.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
Debug.WriteLine("Section {0} is now unprotected.",
connStrings.SectionInformation.Name);
}
else
Debug.WriteLine(
"Can't unprotect, section {0} is locked",
connStrings.SectionInformation.Name);
}
else
Debug.WriteLine(
"Section {0} is already unprotected.",
connStrings.SectionInformation.Name);
}
else
Debug.WriteLine("Can't get the section {0}", section);
}

After playing around with this for a while, I discovered that the issue comes from the ConfigurationSaveMode.Full option.
In both ProtectSettings() and UnProtectSettings(), instead of
connStrings.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
simply use:
config.Save();
I have no idea why that option leads to unwanted behavior.

Related

Having Issues reading / parsing Xml doc

I have a Xml doc similar (edited for here) to this:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WebApptNotificationService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<connectionStrings>
removed for questions
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\test\"/>
</smtp>
</mailSettings>
<mailSettings>
<smtp from="xxxxx#xxxxxx.com">
<network host="mail.xxxxxxxx.com" enableSsl="true" password="xxxxxx" port="xxx" userName="xx#xxxxxxxx.com"/>
</smtp>
<smtp from="No.Reply#xxxxxxxxxx.org">
<network host="1stmsmail.xxxx.local" enableSsl="true" password="xxxxxxx" port="587" userName="ouruser"/>
</smtp>
</mailSettings>
</system.net>
<applicationSettings>
<WebApptNotificationService.Properties.Settings>
<setting name="ConfirmationInterval" serializeAs="String">
<value>60000</value>
</setting>
<setting name="EmailFromName" serializeAs="String">
<value>Test</value>
</setting>
<setting name="EmailFromAddress" serializeAs="String">
<value>mobile#xxxxx.com</value>
</setting>
<setting name="DaysBeforeReminder" serializeAs="String">
<value>2</value>
</setting>
<setting name="MinTextMinute" serializeAs="String">
<value>480</value>
</setting>
<setting name="MaxTextMinute" serializeAs="String">
<value>1200</value>
</setting>
</WebApptNotificationService.Properties.Settings>
</applicationSettings>
</configuration>
I am trying to read the values for using the following code:
private string parseXML(string name)
{
string returnVal = string.Empty;
XmlDocument xmlDoc = xmlFile.SettingXML;
//returnVal = xmlDoc.GetElementsByTagName(name).ToString();
XmlNode node = xmlDoc.SelectSingleNode("//configuration//applicationSettings//WebApptNotificationService.Properties.Settings//setting");
MessageBox.Show(node.ToString());
//returnVal = xmlDoc.DocumentElement.Name.(x => x.Element("Author"));
return returnVal;
}
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim xdoc As XDocument = XDocument.Load(FILENAME)
Dim versions As IEnumerable(Of XElement) = xdoc.Descendants("Version")
For Each version As XElement In versions
For Each trunk As XElement In version.Elements("Trunk")
Console.WriteLine(CType(trunk, String))
ComboBox1.Items.Add(CType(trunk, String))
Next trunk
For Each xEle As XElement In version.Elements("Branch")
Console.WriteLine(CType(xEle, String))
ComboBox2.Items.Add(CType(xEle, String))
Next xEle
Next version
End Sub
Now xmlFile.SettingXML is a class that is created from a config file. It is stored as a class. I want to get the values from the settings name, based on the name passed in. It appears though as if I am failing miserably. If someone could please point me to the correct way to handle this it would be very much appreciated.
Edit: Failing miserably as was pointed out doesn't describe this issue. Right now I am getting System.Xml.XmlElement in the Messagebox.
As you say Right now I am getting System.Xml.XmlElement in the Messagebox try use MessageBox.Show(node.InnerText) this wil get the inner text of the settings element (node object). If you display your node object in the message box it will call the ToString method on the object whits is System.Xml.XmlElement.
Whit XDocument you easily can do this:
static void Main(string[] args)
{
string value = ParseXML("EmailFromAddress");
Console.WriteLine(value);
}
private static string ParseXML(string name)
{
// Load Document use 'XDocument.Parse' if you want to load the document from string
XDocument xmlDoc = XDocument.Load("C:\\t\\2.txt");
// Select element setting where name attribute is equal to name
var node = xmlDoc
.Descendants("WebApptNotificationService.Properties.Settings")
.Elements("setting")
.FirstOrDefault(x => (string) x.Attribute("name") == name);
return node.Value;
}

Memcache - Cached Data is always null

Below is my try to use Memcache in a console application.
App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="enyim.com"/>
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection,Enyim.Caching"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<enyim.com>
<memcached protocol="Binary">
<severs>
<add address="127.0.0.1" port="11211"/>
</severs>
</memcached>
</enyim.com>
</configuration>
C#
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
try
{
using (MemcachedClient memcache = new MemcachedClient())
{
string cachedTime = memcache.Get<string>("CachedTime");
if (cachedTime == null)
{
memcache.Store(Enyim.Caching.Memcached.StoreMode.Set, "CachedTime", DateTime.Now.ToString());
cachedTime = memcache.Get<string>("CachedTime");
}
Console.WriteLine(cachedTime);
Console.WriteLine(dt);
}
}
catch (Exception ex)
{
}
}
Every time the value of cachedDate is NULL
Change App.Config to the following and it should work:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="enyim.com">
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<enyim.com>
<memcached>
<servers>
<add address="127.0.0.1" port="11211" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
</enyim.com>
</configuration>

Clearing an Enterprise Library Logging log file

How would I delete / clear / wipe / overwrite a log file being written through EL6 logging. I am using a logwriter instance to write to a log file that needs to be overwritten every cycle as my program runs in a continuous loop. I will be writing values then overwriting as new values come through.
There may be other/better ways to attack this, but I was able to clear the log file by temporarily repointing the static LogWriter to a temp file, clearing the log with simple File I/O, and then reconnecting the original LogWriter.
I wrote up a simple C# Console App to demonstrate. There are some hard-coded references to the log file configuration in App.config that could probably be cleaned up by using the ConfigurationSourceBuilder, but hopefully this can get you started.
Programs.cs:
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using System;
using System.Diagnostics;
using System.IO;
namespace LogFileClearance
{
public static class Marker
{
public static LogWriter customLogWriter { get; set; }
}
class Program
{
private static object _syncEventId = new object();
private static object locker = new object();
private static int _eventId = 0;
private const string INFO_CATEGORY = "All Events";
static void Main( string [] args )
{
InitializeLogger();
Console.WriteLine( "Enter some input, <Enter> or q to quit, c to clear the log file" );
string input = Console.ReadLine().ToUpper();
while ( ! string.IsNullOrEmpty(input) && input != "Q" )
{
Console.WriteLine( "You entered {0}", input );
if ( input == "C" )
{
ClearLog();
}
else
{
WriteLog( input );
}
Console.WriteLine( "Enter some input, <Enter> or q to quit, c to clear the log file" );
input = Console.ReadLine().ToUpper();
}
}
private static int GetNextEventId()
{
lock ( _syncEventId )
{
return _eventId++;
}
}
public static void InitializeLogger()
{
try
{
lock ( locker )
{
if ( Marker.customLogWriter == null )
{
var writer = new LogWriterFactory().Create();
Logger.SetLogWriter( writer, false );
}
else
{
Logger.SetLogWriter( Marker.customLogWriter, false );
}
}
}
catch ( Exception ex )
{
Debug.WriteLine( "An error occurred in InitializeLogger: " + ex.Message );
}
}
static internal void WriteLog( string message )
{
LogEntry logEntry = new LogEntry();
logEntry.EventId = GetNextEventId();
logEntry.Severity = TraceEventType.Information;
logEntry.Priority = 2;
logEntry.Message = message;
logEntry.Categories.Add( INFO_CATEGORY );
// Always attach the version and username to the log message.
// The writeLog stored procedure will parse these fields.
Logger.Write( logEntry );
}
static internal void ClearLog()
{
string originalFileName = string.Format(#"C:\Logs\LogFileClearance.log");
string tempFileName = originalFileName.Replace( ".log", "(TEMP).log" );
var textFormatter = new FormatterBuilder()
.TextFormatterNamed( "Custom Timestamped Text Formatter" )
.UsingTemplate("{timestamp(local:MM/dd/yy hh:mm:ss.fff tt)} tid={win32ThreadId}: {message}");
#region Set the Logging LogWriter to use the temp file
var builder = new ConfigurationSourceBuilder();
builder.ConfigureLogging()
.LogToCategoryNamed( INFO_CATEGORY ).WithOptions.SetAsDefaultCategory()
.SendTo.FlatFile( "Flat File Trace Listener" )
.ToFile(tempFileName);
using ( DictionaryConfigurationSource configSource = new DictionaryConfigurationSource() )
{
builder.UpdateConfigurationWithReplace(configSource);
Marker.customLogWriter = new LogWriterFactory(configSource).Create();
}
InitializeLogger();
#endregion
#region Clear the original log file
if ( File.Exists(originalFileName) )
{
File.WriteAllText(originalFileName, string.Empty);
}
#endregion
#region Re-connect the original file to the log writer
builder = new ConfigurationSourceBuilder();
builder.ConfigureLogging()
.WithOptions.DoNotRevertImpersonation()
.LogToCategoryNamed( INFO_CATEGORY ).WithOptions.SetAsDefaultCategory()
.SendTo.RollingFile("Rolling Flat File Trace Listener")
.RollAfterSize(1000)
.FormatWith(textFormatter).WithHeader("").WithFooter("")
.ToFile(originalFileName);
using ( DictionaryConfigurationSource configSource = new DictionaryConfigurationSource() )
{
builder.UpdateConfigurationWithReplace( configSource );
Marker.customLogWriter = new LogWriterFactory( configSource ).Create();
}
InitializeLogger();
#endregion
}
}
}
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="" logWarningsWhenNoCategoriesMatch="true">
<listeners>
<add fileName="C:\Logs\LogFileClearance.log" footer="" formatter="Timestamped Text Formatter"
header="" rollFileExistsBehavior="Increment"
rollInterval="None" rollSizeKB="1000" timeStampPattern="yyyy-MM-dd"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="Log File Listener" />
</listeners>
<formatters>
<add template="{timestamp(local:MM/dd/yy hh:mm:ss tt)} tid={win32ThreadId}: {message}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="Timestamped Text Formatter" />
</formatters>
<categorySources>
<add switchValue="Information" name="All Events">
<listeners>
<add name="Log File Listener" />
</listeners>
</add>
<add switchValue="Error" name="Logging Errors & Warnings">
<listeners>
<add name="Log File Listener" />
</listeners>
</add>
</categorySources>
<specialSources>
<allEvents switchValue="Information" name="All Events" />
<notProcessed switchValue="All" name="Unprocessed Category" />
<errors switchValue="All" name="Logging Errors & Warnings" />
</specialSources>
</loggingConfiguration>
</configuration>

Self Hosted Service Reporting 413 when uploading base64 encoded string

I have a self hosted Rest Service and users are reporting getting 413 errors when uploading large images. It works with smaller strings
The images are being sent as a base64 encoded string.
I have a feeling it is something to do with a default limit that I need to increase from some other threads I have read.
But I have been unable to work out what an where I need to add the configuration?
Do I need to add it to the App.config?
This is my current App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="Service.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="HttpApiService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<userSettings>
<Service.Properties.Settings>
<setting name="URL" serializeAs="String">
<value>https://localhost:8083/</value>
</setting>
</Service.Properties.Settings>
<HttpApiService.Properties.Settings>
<setting name="URL" serializeAs="String">
<value>https://localhost:8083/</value>
</setting>
</HttpApiService.Properties.Settings>
</userSettings>
</configuration>
I have the feeling it is something along the lines of:
<system.serviceModel>
<webHttpBinding>
<binding
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647" transferMode="Streamed">
</binding>
</webHttpBinding>
But wherever I try to add that section into my app.config I get an error.
Can anyone tell me how to solve this 413 problem in a self hosted service?
I believe this is the answer...
_config.MaxReceivedMessageSize = 5242880; // 5mb
_config.MaxBufferSize = 5242880; // 5mb
In the following:
namespace HttpApiService
{
public partial class HttpApiService : ServiceBase
{
private HttpSelfHostServer _server;
//private readonly HttpSelfHostConfiguration _config; // http
private readonly MyHttpsSelfHostConfiguration _config; // https
public string ServiceAddress = Settings.Default.URL;
public HttpApiService()
{
InitializeComponent();
_config = new MyHttpsSelfHostConfiguration(ServiceAddress);
_config.MapHttpAttributeRoutes();
_config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", new { id = RouteParameter.Optional });
// added these to solve the upload size problem
_config.MaxReceivedMessageSize = 5242880; // 5mb
_config.MaxBufferSize = 5242880; // 5mb
}
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("HttpApiService started.");
_server = new HttpSelfHostServer(_config);
_server.OpenAsync();
}
protected override void OnStop()
{
EventLog.WriteEntry("HttpApiService stopped.");
_server.CloseAsync().Wait();
_server.Dispose();
}
class MyHttpsSelfHostConfiguration : HttpSelfHostConfiguration
{
public MyHttpsSelfHostConfiguration(string baseAddress) : base(baseAddress) { }
public MyHttpsSelfHostConfiguration(Uri baseAddress) : base(baseAddress) { }
protected override BindingParameterCollection OnConfigureBinding(HttpBinding httpBinding)
{
httpBinding.Security.Mode = HttpBindingSecurityMode.Transport;
//Console.WriteLine("https is on");
return base.OnConfigureBinding(httpBinding);
}
}
}
}

Custom Config section in App.config C#

I'm a quite beginner with config sections in c#
I want to create a custom section in config file. What I've tried after googling is as the follows
Config file:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="MyCustomSections">
<section name="CustomSection" type="CustomSectionTest.CustomSection,CustomSection"/>
</sectionGroup>
</configSections>
<MyCustomSections>
<CustomSection key="Default"/>
</MyCustomSections>
</configuration>
CustomSection.cs
namespace CustomSectionTest
{
public class CustomSection : ConfigurationSection
{
[ConfigurationProperty("key", DefaultValue="Default", IsRequired = true)]
[StringValidator(InvalidCharacters = "~!##$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)]
public String Key
{
get { return this["key"].ToString(); }
set { this["key"] = value; }
}
}
}
When I use this code to retrieve Section I get an error saying configuration error.
var cf = (CustomSection)System.Configuration.ConfigurationManager.GetSection("CustomSection");
What am I missing?
Thanks.
Edit
What I need ultimately is
<CustomConfigSettings>
<Setting id="1">
<add key="Name" value="N"/>
<add key="Type" value="D"/>
</Setting>
<Setting id="2">
<add key="Name" value="O"/>
<add key="Type" value="E"/>
</Setting>
<Setting id="3">
<add key="Name" value="P"/>
<add key="Type" value="F"/>
</Setting>
</CustomConfigSettings>
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="customAppSettingsGroup">
<section name="customAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</sectionGroup>
</configSections>
<customAppSettingsGroup>
<customAppSettings>
<add key="KeyOne" value="ValueOne"/>
<add key="KeyTwo" value="ValueTwo"/>
</customAppSettings>
</customAppSettingsGroup>
</configuration>
Usage:
NameValueCollection settings =
ConfigurationManager.GetSection("customAppSettingsGroup/customAppSettings")
as System.Collections.Specialized.NameValueCollection;
if (settings != null)
{
foreach (string key in settings.AllKeys)
{
Response.Write(key + ": " + settings[key] + "<br />");
}
}
Try using:
var cf = (CustomSection)System.Configuration.ConfigurationManager.GetSection("MyCustomSections/CustomSection");
You need both the name of the section group and the custom section.
Highlight ConfigurationSection press F1,
You will see that the implementation on the MSDN website overrides a property called "Properties" which returns a "ConfigurationPropertyCollection", as your properties have a matching attribute of that type you should be able to populate this collection with your properties if not wrap them in the same way the MS guys have.

Categories