2009-11-10 30 views
1

我正在使用AsyncFileUpload控件上传图像。 它从本地主机正常工作,但是当我将其上载到服务器时,出现以下错误。AsyncFileUpload SerializationException

我甚至不明白这个错误的原因。我会很感激任何答案。

这是我使用

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; 
} 

错误

无法序列化会话状态的方法。 在“的StateServer”和“SQLServer的”模式, ASP.NET将序列化会话 状态对象,并且作为结果 非序列化的对象或 MarshalByRef对象不允许 。如果自定义会话状态存储库 以“自定义”模式执行的类似序列化为 ,则适用相同限制 。

堆栈跟踪: [SerializationException:类型 'System.Web.HttpPostedFile' 在 大会 '的System.Web,版本= 2.0.0.0, 文化=中性 公钥= b03f5f7f11d50a3a' 被 未标记为序列化的。]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 型)7733643个
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型 型,的StreamingContext上下文)258
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() 111 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(对象 OBJ,ISurrogateSelector surrogateSelector,的StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter来 转换器,objectWriter objectWriter) 161 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(对象 OBJ,ISurrogateSelector surrogateSelector,的StreamingContext 上下文,serObjectInfoInit serObjectInfoInit,IFormatterConverter来 转换器,objectWriter objectWriter) + 51 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象 图表,部首[] inHeaders, __BinaryWriter serWriter,布尔FCHECK)410
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流 serializationStream,对象图, 部首[]标头,布尔FCHECK)134 System.Web.Util.AltSerialization.WriteValueToStream(对象 值,的BinaryWriter作家)1577

[HttpException(0X80004005):无法 序列化会话状态。在 'StateServer'和'SQLServer'模式下, ASP。NET将序列化会话 状态对象,并因此 不可序列化对象或 MarshalByRef对象不允许 。同样的限制 适用,如果类似的序列化是 通过自定义会话状态存储在 “自定义”模式下完成。]
System.Web.Util.AltSerialization.WriteValueToStream(对象 价值的BinaryWriter作家)1662
系统。 Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(对象 价值的BinaryWriter作家)+34
System.Web.SessionState.SessionStateItemCollection.Serialize(的BinaryWriter 作家)606
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData 项目,溪流)+239
System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData 项,的Int32 initialStreamSize,字节[] & BUF,的Int32 &长度)72
System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext的 上下文,字符串ID , SessionStateStoreData项,对象 lockId,布尔的newitem)87
System.Web.SessionState.SessionStateModule.OnReleaseState(对象 源,EventArgs的EventArgs的)560
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep .Execute() +68 System.Web.HttpApplication.ExecuteStep(IExecutionStep 一步,布尔& completedSynchronously) +75

回答

1

问题在于你的本地计算机和Web服务器之间在IIS中配置差异。

您的服务器似乎已设置为通过使用StateServer(另一台PC来处理内存中的大量用户数据)或使用SQL Server(您的数据库将用户对象存储在特殊表中)来处理会话。为了将数据传输到状态服务器或您的数据库服务器,IIS将序列化会话信息以将其传输到其他服务器。基本上,这将获取给定对象的所有细节并将它们转换为XML,以便可以根据需要将对象“保存”并“加载”到内存中。

这种情况下的具体问题是'System.Web.HttpPostedFile'类不支持序列化。通常,这个问题是由我们自己的开发人员编写的类发生的,我们可以给类添加一个属性,但是在这里出现问题存在于由.NET框架提供的类中。恐怕你需要找到解决这个问题的方法,比如写你自己的课程或者不使用这个课程。

+0

另外,您可以尝试通过IIS配置切换Web服务器上的会话处理方式,但是我会猜测这是无法控制的。 – 2009-11-10 16:52:54

+0

非常感谢您的回答。这非常有帮助。 – StrouMfios 2009-11-12 17:59:50