Archive for the '.Net' Category

08
Sep
10

Changing log4net log file path via code

Sometimes we might have to place the log files away from the location where the application is installed. And lo there is an option to do that! In the config file create a variable like below

<file type="log4net.Util.PatternString" value="%property{SomeVariable}log.txt" />

And in the code, before calling log4net configure, set the new path to the Variable

log4net.GlobalContext.Properties["SomeVariable"] = YourNewPath;
log4net.Config.XmlConfigurator.Configure();

Simple isn’t it Smile

24
Mar
10

remove objects from an Enumerable collection in a loop

If you are trying to remove an object from a list that you are currently iterating through like below,

foreach (MyObject myObject in MyListOfMyObjects)
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}

you will get an error message that you cannot do it.

Best alternative is to create a copy of the object and loop through it and remove from main object

foreach (MyObject myObject in new List<MyObject>(MyListOfMyObjects))
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}

Simple isn’t it :)

Source : StackOverflow

12
Mar
10

xml schema generation, serialization & deserialization explained

Lets consider a simple xml named as sample.xml. This can be an xml that you are getting as a output of webservice, a function or just a plain file that you might read in your application.

<users>
    <user>
        <id>1</id>
        <name>asdf</name>
        <fullname>asdf,asdf</fullname>
    </user>
    <user>
        <id>2</id>
        <name>qwer</name>
        <fullname>qwer,qwer</fullname>
    </user>
</users>

Lets create a XML Schema aka XSD file

Open ‘Visual Studio 2008 Command Prompt’ and type in

xsd sample.xml

This will generate sample.xsd file in the folder where you are currently running this command from. Below is how it looks.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="users" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="users" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="user">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="id" type="xs:string" minOccurs="0" />
              <xs:element name="name" type="xs:string" minOccurs="0" />
              <xs:element name="fullname" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Lets create a class for serialization of xml file

xsd sample.xsd /classes /language:cs

This will generate sample.cs file. By default in the generated file, the collection used is Array.

private usersUser[] itemsField;

Lets use ObservableCollection as it is a generic dynamic data collection that provides notifications (using an interface "INotifyCollectionChanged") when items get added, removed, or when the whole collection is refreshed.

Below is how the modified class file looks like.

//——————————————————————————
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3607
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//——————————————————————————

using System.Xml.Serialization;
using System.Collections.ObjectModel;

//
// This source code was auto-generated by xsd, Version=2.0.50727.1432.
//

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class users {

    private ObservableCollection<usersUser> itemsField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("user", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public ObservableCollection<usersUser> Items
    {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class usersUser {
    private string idField;
    private string nameField;
    private string fullnameField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string fullname {
        get {
            return this.fullnameField;
        }
        set {
            this.fullnameField = value;
        }
    }
}

Lets read a file from file system [ Serialization ]. Below is the sample code for doing so

System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
ofd.Multiselect = false;
ofd.Filter = "XML File|*.xml";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    try
    {
        if (File.Exists(ofd.FileName))
        {
        XmlSerializer deserializer = new XmlSerializer(typeof(users));
        TextReader textReader = new StreamReader(ofd.FileName);
        objUsers = new users();
        objUsers = (users)deserializer.Deserialize(textReader);
        textReader.Close();  
        }
    }
    catch
    {
        MessageBox.Show("Not a valid file");
    }
}

To add a new user, below is the sample code

usersUser newuser = new usersUser();
newuser.id = "3";
newuser.name = "zxcv";
newuser.fullname = "zxcv,zxcv";
if (objUsers == null)
    objUsers= new users();
objUsers.Items.Add(newuser);

Lets write a xml file from the objects that we have created [ Deserialization ]. Below is the sample code for doing so

if (objUsers == null)
    objUsers = new users();
SaveFileDialog dlg = new SaveFileDialog();
dlg.FileName = "New";
dlg.DefaultExt = ".xml";
dlg.Filter = "XML file|*.xml";
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
    string filepath = dlg.FileName;
    XmlSerializer serializer = new XmlSerializer(typeof(users));
    TextWriter textWriter = new StreamWriter(filepath);
    serializer.Serialize(textWriter, objUsers);
    textWriter.Close();
}          

Simple isn’t it :)

Sample code explained in this post is available here

12
Jan
10

wcf service / asmx working with ssl

Sometimes while working with SSL, we will get error ‘The provided URI scheme ‘https’ is invalid; expected ‘http’.’

This is because we might have set Security mode=”None” in web.config/app.config

Change the security mode to Transport. Sample settings is as below

<system.serviceModel>
      <bindings>
          <basicHttpBinding>
              <binding name="PrintRequestSoap"    closeTimeout="01:00:00" openTimeout="01:00:00"
                  receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false"
                  bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                  maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
                  maxReceivedMessageSize="2147483647" messageEncoding="Text"
                  textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                  <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
                      maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                  <security mode="Transport">
                      <transport clientCredentialType="None" proxyCredentialType="None"
                          realm="" />
                      <message clientCredentialType="UserName" algorithmSuite="Default" />
                  </security>
              </binding>
          </basicHttpBinding>
      </bindings>
    <client>
      <endpoint address=”asmx/wcf service endpoint"
        binding="basicHttpBinding" bindingConfiguration="PrintRequestSoap"
        contract="PrintDataRequest.PrintRequestSoap" name="PrintRequestSoap" />
    </client>

Simple isn’t it :)

02
Nov
09

extended 404 errors in IIs 7

With lot of new enhancements on how the server can control the files/actions, below are the new set of error codes that extend 404 error status.

404.1
Site not found

404.2
Denied by policy

404.3
Denied by mime map
404.4
No handler
404.5
Request Filtering: URL Sequence denied
404.6
Request Filtering: Verb denied
404.7
Request Filtering: File extension denied
404.8
Request Filtering: Denied by hidden segment
404.9
Denied since hidden file attribute has been set
404.10
Request Filtering: Denied because request header is too long
404.11
Request Filtering: Denied because URL doubled escaping
404.12
Request Filtering: Denied because of high bit characters
404.13
Request Filtering: Denied because content length too large
404.14
Request Filtering: Denied because URL too long
404.15
Request Filtering: Denied because query string too long

That means lot more error handling for you :)

via IIS.Net

Technorati Tags: ,,,
29
Oct
09

download clickonce update manually after app has started

Was trying all the while using ApplicationDeployment class. Ran into lot of errors. Found this awesome code from MSDN and it works like charm.. you might say obvious isn’t it :)

long sizeOfUpdate = 0;

private void UpdateApplication()
{
    if (ApplicationDeployment.IsNetworkDeployed)
    {
        ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
        ad.CheckForUpdateCompleted += new CheckForUpdateCompletedEventHandler(ad_CheckForUpdateCompleted);
        ad.CheckForUpdateProgressChanged += new DeploymentProgressChangedEventHandler(ad_CheckForUpdateProgressChanged);

        ad.CheckForUpdateAsync();
    }
}

void  ad_CheckForUpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e)
{
    downloadStatus.Text = String.Format("Downloading: {0}. {1:D}K of {2:D}K downloaded.", GetProgressString(e.State), e.BytesCompleted/1024, e.BytesTotal/1024);  
}

string GetProgressString(DeploymentProgressState state)
{
    if (state == DeploymentProgressState.DownloadingApplicationFiles)
    {
        return "application files";
    }
    else if (state == DeploymentProgressState.DownloadingApplicationInformation)
    {
        return "application manifest";
    }
    else
    {
        return "deployment manifest";
    }
}

void ad_CheckForUpdateCompleted(object sender, CheckForUpdateCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show("ERROR: Could not retrieve new version of the application. Reason: \n" + e.Error.Message + "\nPlease report this error to the system administrator.");
        return;
    }
    else if (e.Cancelled == true)
    {
        MessageBox.Show("The update was cancelled.");
    }

    // Ask the user if they would like to update the application now.
    if (e.UpdateAvailable)
    {
        sizeOfUpdate = e.UpdateSizeBytes;

        if (!e.IsUpdateRequired)
        {
            DialogResult dr = MessageBox.Show("An update is available. Would you like to update the application now?\n\nEstimated Download Time: ", "Update Available", MessageBoxButtons.OKCancel);
            if (DialogResult.OK == dr)
            {
                BeginUpdate();
            }
        }
        else
        {
            MessageBox.Show("A mandatory update is available for your application. We will install the update now, after which we will save all of your in-progress data and restart your application.");
            BeginUpdate();
        }
    }
}

private void BeginUpdate()
{
    ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
    ad.UpdateCompleted += new AsyncCompletedEventHandler(ad_UpdateCompleted);

    // Indicate progress in the application’s status bar.
    ad.UpdateProgressChanged += new DeploymentProgressChangedEventHandler(ad_UpdateProgressChanged);
    ad.UpdateAsync();
}

void ad_UpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e)
{
    String progressText = String.Format("{0:D}K out of {1:D}K downloaded – {2:D}% complete", e.BytesCompleted / 1024, e.BytesTotal / 1024, e.ProgressPercentage);
    downloadStatus.Text = progressText;
}

void ad_UpdateCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        MessageBox.Show("The update of the application’s latest version was cancelled.");
        return;
    }
    else if (e.Error != null)
    {
        MessageBox.Show("ERROR: Could not install the latest version of the application. Reason: \n" + e.Error.Message + "\nPlease report this error to the system administrator.");
        return;
    }

    DialogResult dr = MessageBox.Show("The application has been updated. Restart? (If you do not restart now, the new version will not take effect until after you quit and launch the application again.)", "Restart Application", MessageBoxButtons.OKCancel);
    if (DialogResult.OK == dr)
    {
        Application.Restart();
    }
}

20
Oct
09

reading string into stream and vice versa

string to stream

byte[] byteArray = Encoding.ASCII.GetBytes( test );
MemoryStream stream = new MemoryStream( byteArray );

string to stream

StreamReader reader = new StreamReader( stream );
string text = reader.ReadToEnd();

via C#411

10
Oct
09

Hello world

This might be another site where I will post my trails with various .Net applications. Mainly I will concentrate on WPF, Silverlight 3, Bridges between WPF, ASP.Net, Silverlight, ActiveX etc. More when time comes.

Lets connect those dots in .Net :)




@pooran

 

May 2012
M T W T F S S
« Nov    
 123456
78910111213
14151617181920
21222324252627
28293031  

Visits so far..

  • 10,471

Follow

Get every new post delivered to your Inbox.