[英]Object not serialized
我在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();
}
}
}
如您所見,我將圖像控件置於會話中。 它在開發服務器上工作正常。 當我將網站發布到域時,出現了問題
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"/>
預覽頁面后,單擊更新bnutton,它什么也沒有做。 甚至沒有重定向到另一頁。 這是我的提交按鈕代碼
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");
請告訴我我在做什么錯。
看一下這篇文章 :
您可以使用上面鏈接中發布的ReadFully函數以這種方式從文件上傳轉換流:
var byteArray = ReadFully( FU_Img.PostedFile.InputStream ) ;
Session["FileUpload"] = byteArray;
然后在您的上傳功能中,您可以將代碼更改為此:
byte[] fileUpload = null;
if (Session["FileUpload"] != null )
{
fileUpload = Session["FileUpload"] as byte[];
}
然后將字節流保存到磁盤或數據庫中。
在會話中存儲控件不是正確的方法。 正如您的堆棧跟蹤指出的那樣,“ FileUpload”未標記為可序列化。
您將映像存儲在磁盤上,並將該映像的路徑存儲在會話中,然后進一步重用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.