Я получаю сообщение “Длина не может быть меньше нуля. Имя параметра: длина” при вызове 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.
Учитывая, что мои другие WebMethods на странице работают, я сделал имя WebMethod короче, и оно сработало. Это простой обход.
“SearchForAddress” и “SearchAddressBy” работают. Я не догадался, что максимальная длина разрешена.
Я до сих пор не знаю, что вызывает проблему. Без сомнения, для этого есть настройка конфигурации. Сложность решения и хрупкость кодовой базы означает, что я не готов искать или изменять что-либо на уровне конфигурации, однако я надеюсь, что это быстрое исправление поможет другим разработчикам схожими проблемами.