У меня есть веб-приложение 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
, но не получилось, поэтому перешел к строковому подходу.
Мое приложение создает файл JSON. Он создает файл JSON путем объединения различных значений из базы данных. Ошибка возникает из-за того, что приложение генерирует json, а в содержимом json ошибок нет. проблема возникает только тогда, когда тип массива добавляется к данным json.
Добавьте (упрощенный и автономный) код контроллера, воспроизводящий ошибку.
Я добавил подробную ошибку из метода сервера и контроллера, который генерирует файл JSON.
Вы создаете неверный файл JSON! Попробуйте поместить свой json-файл в https://jsonbeautify.com/! Проблема в том, что \ попробуйте вместо этого поставить двойной \.
Ожидается «STRING», «NUMBER», «NULL», «TRUE», «FALSE», «{», «[», «]», получено «неопределено».
Я помещаю path.Replace('\','\\'). JSON действителен, но все равно получает ту же ошибку
Я не могу выполнить отладку, поскольку эта функция работает локально.
Если вам нужно отладить приложение, работающее на сервере IIS, вы можете подключить отладчик к экземпляру IIS. Просто выполните следующие действия:
w3wp.exe
из списка процессов. Нажмите «Прикрепить».Вот так:
И согласно вашему коду, я думаю, проблема может быть в правах пользователя. Попробуйте установить удостоверение пула приложений для администратора и проверьте, работает ли это у вас.
Выберите пул, который необходимо настроить -> Расширенные настройки... -> раздел Process Model
-> Идентификация.
Введите имя и пароль локального администратора.
Мне удалось выяснить проблему, речь шла не о JSON: когда я искал в каталоге файл mme на сетевом диске, для просмотра каталога требовалось олицетворение через веб-приложение.
Приложение принимает массив? Из какого приложения возникла эта ошибка IIS? Без более подробной информации об ошибках и отладке в рабочем режиме трудно сказать. Ошибка возникает в приложении, которое генерирует JSON, или в приложении, которое читает JSON? Возможно, ваше приложение проверяет свойства json!