Вопрос:
Я получаю сообщение “Длина не может быть меньше нуля. Имя параметра: длина” при вызове WebMethod на простой странице ASP.NET WebForms (ASPX). Ошибка не дает ясного представления (что я вижу) о том, что проблема, и как GET, так и POST вызывает другие WebMethods с похожими сигнатурами на странице.
Я предполагаю, что что-то в Sitecore вызывает проблему.
Полная ошибка в ответе:
[ArgumentOutOfRangeException: Length cannot be less than zero. Parameter name: length] System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +10929307 Sitecore.Web.RequestUrl.get_ItemPath() +138 Sitecore.Pipelines.HttpRequest.SiteResolver.GetItemPath(HttpRequestArgs args, SiteContext context) +32 Sitecore.Pipelines.HttpRequest.SiteResolver.UpdatePaths(HttpRequestArgs args, SiteContext site) +69 Sitecore.Pipelines.HttpRequest.SiteResolver.Process(HttpRequestArgs args) +49 Sitecore.Support.Pipelines.HttpRequest.SiteResolver.Process(HttpRequestArgs args) +261 (Object , Object[] ) +59 Sitecore.Pipelines.PipelineMethod.Invoke(Object[] parameters) +36 Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) +237 Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists) +158 Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain) +64 Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args) +50 Sitecore.Nexus.Web.HttpModule.(Object , EventArgs ) +450 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
Моя страница WebForms называется “AddressLookupService.aspx:”, расположенная в корне сайта, и моя подпись WebMethod (я также не знаю ничего внутреннего для WebMethod, вызывающего проблему):
[WebMethod] [System.Web.Script.Services.ScriptMethod(UseHttpGet = false)] public static string SearchAddressByFormattedAdd(string FormattedAddress, string SessionToken) { … }
Я вызываю службу из основного jQuery $.ajax() следующим образом:
function CallAddressLookup() { var Result = null; var url = «/AddressLookupService.aspx/SearchAddressByFormattedAddress»; var postData = { FormattedAddress: «123 Smith Street», SessionToken: «ABC» }; $.ajax( { async: false, url: url, dataType: «json», data: JSON.stringify(postData), type: «POST», contentType: ‘application/json; charset=utf-8’, success: function (dataString, textStatus, jqXHR) { Result = … }, error: function (jqXHR, textStatus, errorThrown) { Result = … } }); return Result; }
Сайт – это тот, к которому я пришел, чтобы интегрировать некоторые новые функции, и содержит код и конфигурацию Sitecore. Я не разработчик Sitecore и не знаю в первую очередь об этом, и это определенно проект типа “патч и молитва” (я работаю в основном с тяжелым Javascript-интерфейсом и добавлением WebMethods для сохранения новых функций).
Что может быть причиной ошибки, и как я могу ее исправить/обойти?
ПРИМЕЧАНИЕ. См. Мой первый ответ для быстрого исправления, который я обнаружил.
Лучший ответ:
Поскольку вы работаете с Sitecore, он попытается определить, что элемент его базы данных совпадает с запрошенным URL, прежде чем разрешать его поиск на диске. Имена элементов в Sitecore имеют максимальную длину (это параметр, который вы можете найти в файлах конфигурации). Таким образом, если ваше имя страницы длиннее, чем эта максимальная длина, вы можете столкнуться с этой проблемой, я считаю.
Если вы хотите работать за пределами Sitecore с помощью веб-методов, я бы посоветовал вам настроить правильный.svc или.asmx для размещения ваших данных JSON вместо использования.aspx файлов. Это заставит Sitecore оставить URL-адреса в покое. Если вам нужен доступ к данным sitecore внутри этих служб, оставьте комментарий, и я укажу вам правильные сообщения здесь, в stackoverflow.
Ответ №1
Учитывая, что мои другие WebMethods на странице работают, я сделал имя WebMethod короче, и оно сработало. Это простой обход.
“SearchForAddress” и “SearchAddressBy” работают. Я не догадался, что максимальная длина разрешена.
Я до сих пор не знаю, что вызывает проблему. Без сомнения, для этого есть настройка конфигурации. Сложность решения и хрупкость кодовой базы означает, что я не готов искать или изменять что-либо на уровне конфигурации, однако я надеюсь, что это быстрое исправление поможет другим разработчикам схожими проблемами.