app.config custom types

I

ink

Hi all,

Is this possable, and how if so?

i have created 3 classes that i have then Serialized to xml and placed in a
textbox. i can then read the text from the textbox and Deserialize it back
into a new object. this to me proves that the classes and the xml are valid.

But when i take that same xml and past it into the App.Config file and use
the
Configuration.GetSection("ImportFormat").SectionInformation.GetRawXml(); to
read it from the config file and then Deserialize it i get the following
error.

- ex {"There is an error in XML document (0, 0)."} System.Exception
{System.InvalidOperationException}
- InnerException {"The type initializer for
'System.Xml.Serialization.XmlSerializationReader' threw an exception."}
System.Exception {System.TypeInitializationException}
- InnerException {"Configuration system failed to initialize"}
System.Exception {System.Configuration.ConfigurationErrorsException}
+ InnerException {"Unrecognized configuration section ImportFormat.
(C:\\Learn\\Csharp\\Desk\\AppConfigTest\\AppConfigTest\\AppConfigTest\\bin\\Debug\\AppConfigTest.vshost.exe.config
line 4)"} System.Exception
{System.Configuration.ConfigurationErrorsException}


Is what i am trying to do not possable?

i have pasted app.config below.

thanks,
ink





<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<ImportFormat>
<ImportRecord TableName="GoodsExpected" RowIdentifier="H"
IndexOfInsertion="0" NoOfRowsPerRecord="5">
<FieldData ColumnName="STORAGE PROVIDER" FieldName="CompanyID"
ColumnIndex="1" RowIndex="0" Required="true" />
<FieldData ColumnName="WAREHOUSE" FieldName="WarehouseID" ColumnIndex="2"
RowIndex="1" Required="true" />
<FieldData ColumnName="ASN REFERENCE" FieldName="ReferenceID"
ColumnIndex="2" RowIndex="2" Required="true" />
<FieldData ColumnName="EXPECTED DATE" FieldName="ExpectedDate"
ColumnIndex="2" RowIndex="3" Required="true" />
<FieldData ColumnName="CUSTOMERID" FieldName="SupplierID" ColumnIndex="2"
RowIndex="4" Required="true" />
</ImportRecord>
<ImportRecord TableName="GoodsReceivedBatch" RowIdentifier="D"
IndexOfInsertion="1" NoOfRowsPerRecord="1" HeaderRowIdentifier="H">
<FieldData ColumnName="PALLET ID" FieldName="PalletID" ColumnIndex="1"
RowIndex="0" Required="false" />
<FieldData ColumnName="ITEM CODE" FieldName="ItemID" ColumnIndex="2"
RowIndex="0" Required="true" />
<FieldData ColumnName="QTY" FieldName="Qty" ColumnIndex="3" RowIndex="0"
Required="true" />
<FieldData ColumnName="ITEM DESCRIPTION" FieldName="Description"
ColumnIndex="4" RowIndex="0" Required="false" />
</ImportRecord>
</ImportFormat>


</configuration>
 
S

sloan

When you write a "Custom Config Section", you gotta write a "Custom Config
Handler".

...

This entry shows how to write a custom configuration handler (based on some
xml in the config file).
http://sholliday.spaces.live.com/Blog/cns!A68482B9628A842A!138.entry

Search for "Handler" and "Settings" in the downloadable code.


Here are some xml tidbits as well.
http://sholliday.spaces.live.com/Blog/cns!A68482B9628A842A!114.entry


You need to go through and understand the FIRST URL above first.
There are some MS links in the headers of some of the source files as well.

...
 
S

sloan

No problem.

Keep in mind my sample is not a direct KB on "how to implement a custom
handler".

I actually have written one to use with my smtp settings thingy.

//Quote from article//
You can download the code HERE. (Right-Click and "Save As" works best)
//End Quote

After you get the code, find this class:
EmailSmtpSettingsHandler : IConfigurationSectionHandler

and throw a break point in there.

You're basically taking xml, and writing xpath statements to populate some
other object.
Aka, you gotta write the glue code which takes XML and converts it to a real
object.

Now, in your case, you're gonna take the xml, and then try and use it for a
deserialization.
Thus the second URL might come in handy.

.............
 
G

Guest

I just went through this myself... here is the solution that I came up with...

..........................................App.config
...............................................

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="MyCustomSection" type="My.Custom.Section.Handler,
My.Custom.Section.Handler.Assembly, Version=1.0.0.0,Culture=neutral,
PublicKeyToken=bd1505632153fa83" />
</configSections>

<MyCustomSection Username="MyUserName" Password="MyPassword" />

</configuration>

....................................My.Custom.Section.Handler.Assembly......................................

using System;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace My.Custom.Section
{
public class Handler: ConfigurationSection
{
[ConfigurationProperty("Username", DefaultValue = "", IsRequired =
true)]
public string Username
{
get
{
return (string)this["Username"];
}
set
{
this["Username"] = value;
}
}

[ConfigurationProperty("Password", DefaultValue = "", IsRequired =
true)]
public string Password
{
get
{
return (string)this["Password"];
}
set
{
this["Password"] = value;
}
}
}
}

..........................................Using the Custom
Section..........................................

using My.Custom.Section;

public class MyClass
{
public void MyMethod()
{
Handler section = (Handler)config.Sections["MyCustomSection"];

string username = section.Username;
string password = section.Password;
}
}

..............................Conclusion...................................

You could also do things like section encryption, etc... like this

System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Handler section = (Handler)config.Sections["MyCustomSection"];

if (!section.SectionInformation.IsProtected)
{

section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
section.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
}

// this is the information I wish I had when I was looking for answers, hope
it helps
 
I

ink

Thanks for this Sam.

i have managed to get it working by putting a Dummy Handler in that does
nothing and the Desterilizing the Raw XML of the section.
Your way is allot more elegant so i think i may implement your solution.

thanks,
ink
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top