R – AsyncFileUpload SerializationException

ajaxcontroltoolkitasp.net

I'm using the AsyncFileUpload control to upload images.
It works fine from localhost, but when I uploaded it on server I get the following error.

I can't even understand the reason of this error. I'll appreciate any answer.

This is the Method that I'm using

protected void AsyncFileUpload1_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e) 
{
    string email = WriteYourEmailTXT.Text;
    var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).ToString("ddMMyyyy");
    string parentFolder = Server.MapPath("uploads");
    string childFolder = parentFolder + "\\" + email + "\\";
    if (!Directory.Exists(childFolder))
        Directory.CreateDirectory(childFolder);

    string counter = getCount();
    if (AsyncFileUpload1.HasFile) {
        string ext = getExtension(AsyncFileUpload1.FileName);
        string finalName = dt + "_" + counter + ext;
        string finalPath = childFolder + finalName;
        AsyncFileUpload1.SaveAs(finalPath);
        SetCount();
        SetFileName(finalName);
    }
}

protected void SetCount() 
{
    HttpCookie aCookie = Request.Cookies["CountPhoto"];
    int cookieNum = 0;
    if (aCookie != null)
        if (aCookie.Value != "")
            cookieNum = int.Parse(aCookie.Value.ToString());

    string newvalue = (cookieNum + 1).ToString();
    Response.Cookies["CountPhoto"].Value = newvalue;
}

protected void SetFileName(string fileName) 
{
    HttpCookie aCookie = Request.Cookies["FileName"];
    var filename = "";
    if (aCookie != null)
        if (aCookie.Value != "") {
            filename = aCookie.Value;
        }
    string newFileName = filename + "," + fileName;
    Response.Cookies["FileName"].Value = newFileName;
}

Error

Unable to serialize the session state.
In 'StateServer' and 'SQLServer' mode,
ASP.NET will serialize the session
state objects, and as a result
non-serializable objects or
MarshalByRef objects are not
permitted. The same restriction
applies if similar serialization is
done by the custom session state store
in 'Custom' mode.

Stack Trace: [SerializationException: Type
'System.Web.HttpPostedFile' in
Assembly 'System.Web, Version=2.0.0.0,
Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' is
not marked as serializable.]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType
type) +7733643
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type
type, StreamingContext context) +258
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
+111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object
obj, ISurrogateSelector
surrogateSelector, StreamingContext
context, SerObjectInfoInit
serObjectInfoInit, IFormatterConverter
converter, ObjectWriter objectWriter)
+161 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object
obj, ISurrogateSelector
surrogateSelector, StreamingContext
context, SerObjectInfoInit
serObjectInfoInit, IFormatterConverter
converter, ObjectWriter objectWriter)
+51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object
graph, Header[] inHeaders,
__BinaryWriter serWriter, Boolean fCheck) +410
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream
serializationStream, Object graph,
Header[] headers, Boolean fCheck) +134
System.Web.Util.AltSerialization.WriteValueToStream(Object
value, BinaryWriter writer) +1577

[HttpException (0x80004005): Unable to
serialize the session state. In
'StateServer' and 'SQLServer' mode,
ASP.NET will serialize the session
state objects, and as a result
non-serializable objects or
MarshalByRef objects are not
permitted. The same restriction
applies if similar serialization is
done by the custom session state store
in 'Custom' mode.]
System.Web.Util.AltSerialization.WriteValueToStream(Object
value, BinaryWriter writer) +1662
System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object
value, BinaryWriter writer) +34
System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter
writer) +606
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData
item, Stream stream) +239
System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData
item, Int32 initialStreamSize, Byte[]&
buf, Int32& length) +72
System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext
context, String id,
SessionStateStoreData item, Object
lockId, Boolean newItem) +87
System.Web.SessionState.SessionStateModule.OnReleaseState(Object
source, EventArgs eventArgs) +560
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
+68 System.Web.HttpApplication.ExecuteStep(IExecutionStep
step, Boolean& completedSynchronously)
+75

Best Answer

The problem lies with a configuration difference in IIS between your local machine and that of your web server.

Your server seems to be setup to handle the session by using a StateServer (another PC to handle a lot of the user data in memory) or by using your SQL Server (your database stores the user objects in special table). In order to transfer the data to the State Server or your Database server IIS will serialize your session information to transport it to the other server. Basically, this takes all the details for a given object and converts them to XML so that the object can be "saved" and "loaded" to/from memory as needed.

The specific problem in this case is that the 'System.Web.HttpPostedFile' class does not support serialization. Usually this problem occurs with classes written by our own developers and we can just add a attribute to the class but it appears here that the problem exists in a class provided by the .NET framework. I'm afraid you will need to find a way to work around the issue such as writing your own class or not making use of this one.

Related Topic