You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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」错误核心原因及对应修复:

  1. 目录权限不足:IIS应用池账户(或模拟的NetworkUser)对basePath目录及子目录无读取和执行、列出文件夹内容权限。需给该账户添加对应权限。
  2. EFS加密目录:basePath所在目录启用了EFS加密,模拟账户无解密权限。需取消目录加密,或给模拟账户添加EFS访问权限。
  3. 路径有效性问题:testPath.BasePath在服务器上不存在,或包含特殊字符导致文件系统无法识别。检查路径值的正确性。
  4. 模拟登录类型错误:使用LogonType.NewCredentials可能无法正确访问本地目录,尝试改用LogonType.Interactive或LogonType.Batch类型登录。

具体修复步骤

  1. 验证basePath在服务器上的实际路径是否存在,格式是否正确。
  2. 给IIS应用池账户(或模拟的NetworkUser)授予basePath目录及所有子目录的读取和执行、列出文件夹内容权限。
  3. 若目录启用EFS加密,取消加密操作,或通过EFS管理工具给模拟账户添加解密权限。
  4. 修改模拟登录代码中的LogonType参数,测试是否能正常访问目录。

内容的提问来源于stack exchange,提问作者BSave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:57