2013-03-22 154 views
2

我在asp.net中有一个fileupload控件,用于上传图片。我想显示预览图像在012.net控制asp.net。这里是ASPX代码对象不可序列化

ASPX

<script type="text/javascript"> 

    function FU_Img_onchange(oFU_Img) { 
     alert("sak"); 
     var img = document.getElementById("<%= Btn_Preview.ClientID%>"); 
     img.click(); 

    } 
    function FU_Video_onchange(oFU_Vid) { 
     var vid = document.getElementById("<%= VidPreview.ClientID %>"); 
     vid.click(); 
    } 
</script> 


背后

protected void Btn_Preview_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (FU_Img.HasFile) 
       { 
        string path = Server.MapPath("/TempImages"); 


        FileInfo oFileInfo = new FileInfo(FU_Img.PostedFile.FileName); 
        string fileName = oFileInfo.Name; 

        string fullFileName = path + "//" + fileName; 
        string imagePath = "/TempImages/" + fileName; 

        if (!Directory.Exists(path)) 
        { 
         Directory.CreateDirectory(path); 
        } 
        Session["FileUpload"] = FU_Img; 
        FU_Img.PostedFile.SaveAs(fullFileName); 
        Img_Prof.ImageUrl = imagePath; 
       } 
      } 
      catch (Exception ex) 
      { 
       using (StreamWriter sw = new StreamWriter("/log.txt")) 
       { 
        sw.NewLine = DateTime.Now.ToString() + "--->>" + ex.ToString() + "\n" + ex.StackTrace.ToString(); 
       } 
      } 
     } 

,你可以看到C#代码,我把我的形象控制会话。它在开发服务器上工作正常。当我张贴的网站域名我得到的问题

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.

堆栈跟踪

[SerializationException: Type 'System.Web.UI.WebControls.FileUpload' 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) +7738443 
    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) +422 
    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` 

我肯定有什么毛病FileUpload控件和会话。但请正确指导我应该怎么做? 在此先感谢

+1

堆栈跟踪和消息清楚地说明了问题:您使用StateServer或数据库来存储会话数据,这意味着它必须被序列化以存储在任一位置。您尝试在会话中保留的FileUpload控件不可序列化,因此失败。 – JerKimball 2013-03-22 07:20:15

回答

2

通过查看异常,可能会将SessionMode设置为SQLServer或StateServer,将其更改为InProc并查看其是否有效。如果它的工作原理意味着您的会话持久性到后端存储不起作用,请检查该代码或发布代码,以便我们可以深入了解该问题。

+0

没有什么像''在我的'web.config'中,默认情况下它可能是StateServer或SQLServer。我把它塞进了“InProc”。它为我工作。 – 2013-03-22 07:33:20

+0

@ SaghirA.Khatri:一个Khatri如果它的工作,你需要它作为InProc比接受答案:) – TalentTuner 2013-03-22 07:34:49

+0

你是什么意思的会话持续。请告诉我。 – 2013-03-22 07:35:36