c# - 对象未序列化

标签 c# asp.net session serialization

我在asp.net中有一个fileupload控件,用来上传图片。我想在 asp.net 的图像控件中显示预览图像。这是 aspx 代码

C#代码隐藏

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

如您所见,我正在将我的图像控件置于 session 中。它在开发服务器上运行良好。当我将网站发布到域时,我遇到了问题

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`

这是我的web.config

<sessionState mode="InProc"
                    cookieless="true"
                    timeout="20"/>

预览我的页面后,我点击更新按钮,但它什么也没做。甚至不重定向到其他页面。 这是我的提交按钮代码

 if (Session["FileUpload"] != null && (!FU_Img.HasFile))
            {
                FU_Img = (FileUpload)Session["FileUpload"];
            }
UserOthers UO = new UserOthers();
            if (FU_Img.HasFile)
            {
                try
                {
                    string Photofilename = Path.GetFileName(FU_Img.FileName);
                    Photofilename = Photofilename.Split('.')[1].ToString();
                    String PathFolder = Server.MapPath(Request.ApplicationPath + @"\upload\u" + Session["UserID"].ToString ());
                    if (!Directory.Exists(PathFolder))
                    {
                        Directory.CreateDirectory(PathFolder);
                    }
                    FU_Img.PostedFile.SaveAs(Server.MapPath(Request.ApplicationPath + @"\upload\u" + Session["UserID"].ToString () + "\\image." + Photofilename));
                    UO.Image = @"/upload/u" + Session["UserID"].ToString () + "/image." + Photofilename;
                }
                catch (Exception ex)
                {
                    //StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message;
                }
            }
 con.update_Pic_Vid(UO, Session["UserID"].ToString ());
            Response.Redirect("/AccountSettings.aspx");

请告诉我我做错了什么。

最佳答案

看看这个post :

您可以使用上面链接中发布的 ReadFully 函数以这种方式从文件上传转换您的流:

 var byteArray = ReadFully( FU_Img.PostedFile.InputStream ) ;
 Session["FileUpload"] = byteArray;

然后在您的上传功能中,您可以将代码更改为:

byte[] fileUpload = null;

if (Session["FileUpload"] != null  )
{
   fileUpload = Session["FileUpload"] as byte[];
}

然后将字节流保存到磁盘或数据库中。

关于c# - 对象未序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570049/

相关文章:

php - 使用 MySQL 和 session 登录

c# - Log4net 生成错误的日志文件名

c# - c# dll 的独立设置 - 已更新

c# - 将文件移动到另一个文件夹时,FileInfo.Path 显示值不在预期范围内异常

c# - 指定的转换无效。(数据表中的整数值)

c# - 转储文件时 Iframe onLoad 不会触发?

asp.net - session 未清除

c# - Parallel.For步长

javascript - 对话框未返回 true,因此由于事件发生而未触发 onClick

session - 检测是否可以在 Symfony 2 中访问请求服务?