views:

769

answers:

1

Hi to everyone,

I'm using the AsyncFileUpload control to upload images. It works fine from loaclhost, 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.

Thanks in advance

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

A: 

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.

Sonny Boy
Also, you can try switching how the sessions are handled on your web server through IIS configuration, but I'm going to guess that's out of your control.
Sonny Boy
Thank you very much for your answer. It's very helpful.
StrouMfios