.NET 4.6.1 MVC部署IIS后创建含数组JSON报Invalid Signature错误
ASP.NET MVC应用部署到IIS后创建含数组的JSON文件报「Invalid Signature」错误
问题现象
- 基于.NET 4.6.1的ASP.NET MVC应用在本地可正常创建JSON文件
- 部署到IIS生产服务器后,创建包含数组/列表类型的JSON文件时抛出「Invalid Signature」错误,移动现有JSON文件也会触发该错误
- 不含数组的JSON内容可正常生成
正常JSON示例
{ "TypeOfTheTest": "Custom", "ExportData": true }
报错JSON示例
{ "TypeOfTheTest": "Custom", "ExportData": true, "DataFiles": [ "C:\\Temp\\1.mme" ] }
服务器错误栈
System.IO.IOException Invalid Signature. System.IO.IOException: Invalid Signature. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileSystemEnumerableIterator`1.CommonInit() at System.IO.FileSystemEnumerableIterator`1..ctor(String path, String originalUserPath, String searchPattern, SearchOption searchOption, SearchResultHandler`1 resultHandler, Boolean checkHost) at System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption) at WebUI.Controllers.TestRequestController.CreateXCrashJasonFile(Int32 testRequestId) in C:\Users\repos\DEVELOPMENT\WebUI\Controllers\TestController.cs:line 0 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult)
对应控制器方法
public JsonResult CreateXCrashJasonFile(int testRequestId) { var response = new JsonResponse(message: "JSON file created successfully", success: true); var testRequestMacros = TestRequestMacroes.ToList(); var macros = testRequestMacros.Select(z => z.Macro.MacroName.Trim()).ToList(); var testPath = PictureVideoPaths; if (testPath != null && !string.IsNullOrEmpty(testPath.DatFolder)) { var basePath = testPath.BasePath; var mmeFiles = Directory.GetFiles(basePath, "*.mme", SearchOption.AllDirectories); List<string> mmePaths = new List<string>(); mmePaths.AddRange(mmeFiles); var ttiBasepath = UtilDefine.GetAppValueToString("dataImportFileObserverDirectory");// var fileName = testRequestId + "-TTI" + DateTime.Now.ToString("-yyyy-MM-dd_hh-mm-ss") + ".json"; var filePath = Path.Combine(ttiBasepath, fileName); var defaultPath = Path.GetDirectoryName(mmeFiles[0]); var defaultName = Path.GetFileNameWithoutExtension(mmeFiles[0]); var outputFileName = defaultName + "-" + DateTime.Now.ToString("-yyyy-MM-dd_hh-mm-ss"); var diademFilePath = Path.Combine(defaultPath, "Result"); var excelFilePath = Path.Combine(defaultPath, "Report"); //MacroTTIServerViewModel _data = new MacroTTIServerViewModel() //{ // DataFiles = mmePaths, // TypeOfTheTest = "Custom", // Macros = macros, // ExportData = true, // OutputPaths = new TTIServerOutputPathsViewModel() // { // DIAdemFilesName = outputFileName, // DIAdemFilesPath = diademFilePath, // ExcelFilesName = outputFileName, // ExcelFilesPath = excelFilePath, // PDFReportFilesName = outputFileName, // PDFReportFilesPath = excelFilePath // } //}; //Tried with class , did not work so moved to string approach StringBuilder sb = new StringBuilder(); sb.Append("{\"DataFiles\":["); foreach (var path in mmePaths) sb.Append("\"" + path.Replace("\\","\\\\") + "\","); sb.Length--; // Remove the last comma sb.Append("] ,\"TypeOfTheTest\":\"Custom\",\"Macros\":["); foreach(var macro in macros) sb.Append("\"" + macro + "\","); sb.Length--; // Remove the last comma sb.Append("] ,\"ExportData\":true,\"OutputPaths\":{"); sb.Append("\"DIAdemFilesPath\":\"" + diademFilePath.Replace("\\","\\\\") + "\","); sb.Append("\"DIAdemFilesName\":\"" + outputFileName + "\","); sb.Append("\"ExcelFilesPath\":\"" + excelFilePath.Replace("\\","\\\\") + "\","); sb.Append("\"ExcelFilesName\":\"" + outputFileName + "\","); sb.Append("\"PDFReportFilesPath\":\"" + excelFilePath.Replace("\\","\\\\") + "\","); sb.Append("\"PDFReportFilesName\":\"" + outputFileName + "\""); sb.Append("}}"); string json1 = sb.ToString(); //string json = JsonConvert.SerializeObject(_data); using (Impersonation.LogonUser(UtilDefine.GetAppValueToString("NetworkDomain"), UtilDefine.GetAppValueToString("NetworkUser"), UtilDefine.GetAppValueToString("NetworkPassword"), LogonType.NewCredentials)) { using (FileStream fs = System.IO.File.Create(filePath)) { var content = new UTF8Encoding(true).GetBytes(json1); fs.Write(content, 0, content.Length); } } } else { response = new JsonResponse(message: "Test path empty", success: false); } return Json(response, JsonRequestBehavior.AllowGet); }
已尝试无效方案
- 使用
JsonConvert.SerializeObject序列化对象生成JSON - 手动拼接JSON字符串
问题根源与修复方案
从错误栈可以看出,异常实际触发在Directory.GetFiles方法,而非JSON文件创建环节。当JSON包含数组时,代码会执行目录遍历逻辑;不含数组的场景可能跳过了该步骤(或mmeFiles为空),因此未触发异常。
「Invalid Signature」错误核心原因及对应修复:
- 目录权限不足:IIS应用池账户(或模拟的NetworkUser)对
basePath目录及子目录无读取和执行、列出文件夹内容权限。需给该账户添加对应权限。 - EFS加密目录:
basePath所在目录启用了EFS加密,模拟账户无解密权限。需取消目录加密,或给模拟账户添加EFS访问权限。 - 路径有效性问题:
testPath.BasePath在服务器上不存在,或包含特殊字符导致文件系统无法识别。检查路径值的正确性。 - 模拟登录类型错误:使用
LogonType.NewCredentials可能无法正确访问本地目录,尝试改用LogonType.Interactive或LogonType.Batch类型登录。
具体修复步骤
- 验证
basePath在服务器上的实际路径是否存在,格式是否正确。 - 给IIS应用池账户(或模拟的NetworkUser)授予
basePath目录及所有子目录的读取和执行、列出文件夹内容权限。 - 若目录启用EFS加密,取消加密操作,或通过EFS管理工具给模拟账户添加解密权限。
- 修改模拟登录代码中的
LogonType参数,测试是否能正常访问目录。
内容的提问来源于stack exchange,提问作者BSave
相关产品推荐
相关产品推荐

