Aspose.Cells.GridWeb IIS部署後,無法使用問題

@peter.zhou

您好,請問換上這個dll,需要再設定什麼嗎?我換上去後,我的站台會直接噴500回來給我…

@Morris705,

您是否在您的项目中用新的(我们在之前的回复中分享过)替换了旧的 Aspose.Cells.GridWeb.Dll? 您是否发现任何异常,请分享完整的堆栈跟踪。 我们会调查并尽快回复您。

@Morris705 这个dll仅仅是多加了日志记录,你的vs工程有异常么?还是服务器上有异常,你这个500错误是怎么引发的,如果工程里报错,请附上vs工程。

在我的iis server將Aspose.Cells.GridWeb.dll替換成withlog的版本,要開啟站台的登入頁就直接出現下方的exception了,換回原本的Aspose.Cells.GridWeb.dll,是可以正常開啟我的登入頁面的

9119ebbc-806e-409b-8d02-dcd4b0868f7e |2023/05/12 10:09:09.570 |Error|GetVPathBuildResultInternal|檔案 ‘/MetaFiT/login.aspx’ 尚未完成先行編譯,因此無法要求此檔案。|System.Web.HttpException (0x80004005): 檔案 ‘/MetaFiT/login.aspx’ 尚未完成先行編譯,因此無法要求此檔案。
於 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
於 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
於 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
於 System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp)
於 System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)
於 System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
於 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
於 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

@Morris705

尚未完成先行編譯,因此無法要求此檔案。|System.Web.HttpException (0x80004005): 檔案 ‘/MetaFiT/login.aspx’ 尚未完成先行編譯,因此無法要求此檔案。

看这个报的错root cause和GridWeb应用没有关系啊
这个login.aspx 尚未完成编译,login.aspx里面的内容是什么呢?有用到GridWeb么?
在替换新的dll后,请将整个web项目整体重新编译再打包发布

我在原本發布出來的站台中,直接將dll替換,就會出現錯誤,但換回原本的dll,就可以正常運行欸… 如果是發布編譯的問題,使用原本的dll就會噴錯了吧?

我將source重新佈署一版試試,請稍等

@Morris705
你先在vs里面重新编译,然后再打包发布,重新部署吧,
在服务器里直接替换dll,是会有问题的

2023-05-12_11h20_25.png (24.3 KB)

重新部署後出現的錯誤,請問session_store_path的資料夾,只能設定在C:\inetpub\wwwroot中嗎?

2023-05-12_11h20_25.png (24.3 KB)

這是gridweb寫入的errorlog,請參考,謝謝

@Morris705
这个表示应用没有访问写入文件的权限
是的,得在iis容器可以管理的路径底下
你参考,配置下,确保web应用能有对相关路径的权限

2023-05-12_11h30_22.png (193.9 KB)

抱歉,上面放錯圖了,gridweb報的錯是這個,請參考,謝謝

@Morris705
在你的web应用base目录下面建立tmpstorage目录
配置改成

<add key="aspose.cells.gridweb.session_store_path" value="/tmpstorage"/>

重新打包试试

2023-05-12_11h55_20.png (53.0 KB)
2023-05-12_11h55_57.png (98.6 KB)

web.config + web base目錄下都有設置,但它還是出現一樣的error

Message: session load file failed: 嘗試將空資料流還原序列化。 , 於 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
於 .(String , String )

@Morris705 有点奇怪,按照道理如果保存失败,日志里也会记录,目前日志里只有读取失败,没有保存失败的记录。
你看下日志里对应的缓存文件是空的么,你把
SessionMode = Aspose.Cells.GridWeb.SessionMode.File;设置成File模式
再操作,看下日志

SessionMode = Aspose.Cells.GridWeb.SessionMode.File;

加上這個設定後,gridweb可以正常的運行了!

但我編輯後存檔,再用微軟的excel開啟檔案,會出現這個提示,請問這是正常的嗎?

2023-05-12_13h45_35.png (11.2 KB)

不应该,你编辑的源文件请上传一下,我们来试下,看看能否浮复现

TestExcel.zip (10.9 KB)

我的操作行為是
1、從資料庫中取出binary,將binary轉成MemoryStream,放進 GridWeb1.ImportExcelFile
2、在web上用GridWeb編輯幾個cell的資料後,將GridWeb1.SaveToExcelFile至MemoryStream,再將MemoryStream轉成binary存放至資料庫
3、用我原本站台的功能,去下載資料庫中這個binary的檔案至用戶端,在用戶端用office excel打開,就會出現上面的那個提示訊息

@Morris705
我测试了下面的代码,保存出来的文件是好的,没有这样的提示,你在save to memory的时候指定下具体的格式

  FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        //Read all bytes into an array from the specified file.
       int nBytes = (int)fs.Length;//计算流的长度
       byte[] byteArray = new byte[nBytes];//初始化用于MemoryStream的Buffer
       int nBytesRead = fs.Read(byteArray, 0, nBytes);//将File里的内容一次性的全部读到byteArray中去
       using (MemoryStream br = new MemoryStream(byteArray))
            {

              GridWeb1.ImportExcelFile(br);
            }
        byte[] binaryout=null;
        using (MemoryStream outmem = new MemoryStream())
            { 
                //指定saveformat
              GridWeb1.SaveToExcelFile(outmem, GridSaveFormat.Excel2003);
              binaryout = outmem.ToArray();
	    }
        using (FileStream fsout = new FileStream(filePath+"_new.xls", FileMode.Create))
            {
               fsout.Write(binaryout, 0, binaryout.Length);
            }
                     

save的時候,加上GridSaveFormat.Excel2003這個option,就沒有出現那個提示了,感謝協助

@Morris705
那就好,不客气