Проблема с созданием файла JSON на рабочем сервере IIS

У меня есть веб-приложение ASP.NET MVC, работающее на .NET 4.6.1. Я создаю файл JSON. Файл создается локально, однако при развертывании кода в IIS на сервере я получаю сообщение об ошибке.

Неверная подпись

Даже перемещение существующего файла JSON приводит к той же ошибке. Я не могу выполнить отладку, поскольку эта функция работает локально.

Проблема возникает только тогда, когда в файл JSON добавляется тип массива или списка. Например — содержимое файла JSON.

{
    "TypeOfTheTest": "Custom", 
    "ExportData": true
} 

это работает, но показанный здесь контент приводит к ошибке «неверная подпись»:

{
    "TypeOfTheTest": "Custom", 
    "ExportData": true, 
    "DataFiles": [ "C:\\Temp\\1.mme" ]
}

Я попытался создать файл с содержимым

{
    "TypeOfTheTest": "Custom", 
    "ExportData": true 
} 

и это работает, но когда я добавляю тип списка или массива в файл, возникает неверная подпись.

Вот подробная ошибка с сервера:

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, но не получилось, поэтому перешел к строковому подходу.

Приложение принимает массив? Из какого приложения возникла эта ошибка IIS? Без более подробной информации об ошибках и отладке в рабочем режиме трудно сказать. Ошибка возникает в приложении, которое генерирует JSON, или в приложении, которое читает JSON? Возможно, ваше приложение проверяет свойства json!

Mårshåll 09.06.2024 18:44

Мое приложение создает файл JSON. Он создает файл JSON путем объединения различных значений из базы данных. Ошибка возникает из-за того, что приложение генерирует json, а в содержимом json ошибок нет. проблема возникает только тогда, когда тип массива добавляется к данным json.

BSave 09.06.2024 18:48

Добавьте (упрощенный и автономный) код контроллера, воспроизводящий ошибку.

David Browne - Microsoft 09.06.2024 19:02

Я добавил подробную ошибку из метода сервера и контроллера, который генерирует файл JSON.

BSave 09.06.2024 19:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы создаете неверный файл JSON! Попробуйте поместить свой json-файл в https://jsonbeautify.com/! Проблема в том, что \ попробуйте вместо этого поставить двойной \.

{ "TypeOfTheTest": "Пользовательский", «ЭкспортДанные»: правда, "DataFiles": [ "C:\Temp\1.mme" ] } Результат: Ошибка анализа в строке 4: ... "DataFiles": [ "C:\Temp\1.mme"] }

Ожидается «STRING», «NUMBER», «NULL», «TRUE», «FALSE», «{», «[», «]», получено «неопределено».

Я помещаю path.Replace('\','\\'). JSON действителен, но все равно получает ту же ошибку

BSave 09.06.2024 21:29
Ответ принят как подходящий

Я не могу выполнить отладку, поскольку эта функция работает локально.

Если вам нужно отладить приложение, работающее на сервере IIS, вы можете подключить отладчик к экземпляру IIS. Просто выполните следующие действия:

  1. Нажмите «Отладка» в строке меню.
  2. Нажмите «Прикрепить к процессу».
  3. Установите флажок «Показать процессы всех пользователей» в левом нижнем углу.
  4. Выберите w3wp.exe из списка процессов. Нажмите «Прикрепить».

Вот так:

И согласно вашему коду, я думаю, проблема может быть в правах пользователя. Попробуйте установить удостоверение пула приложений для администратора и проверьте, работает ли это у вас.

Выберите пул, который необходимо настроить -> Расширенные настройки... -> раздел Process Model -> Идентификация.

Введите имя и пароль локального администратора.

Мне удалось выяснить проблему, речь шла не о JSON: когда я искал в каталоге файл mme на сетевом диске, для просмотра каталога требовалось олицетворение через веб-приложение.

Другие вопросы по теме