使用Sitecore在站点中调用ASPX WebMethod时,“长度不能小于零。参数名称:长度”

时间:2014-06-26 06:52:09

标签: asp.net ajax sitecore webmethod

我收到"长度不能小于零。参数名称:长度"在纯ASP.NET WebForms(ASPX)页面上调用WebMethod时出错。该错误没有明确的想法(我可以看到),问题是什么,以及对页面上具有类似签名的其他WebMethods的GET和POST调用。

我猜它是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的重度UI并添加WebMethods以保持新功能分离)。

可能导致错误的原因是什么,我该如何修复/解决它?

注意:请参阅我的第一个答案,了解我发现的快速修复方法。

2 个答案:

答案 0 :(得分:2)

由于您正在使用Sitecore,因此在解析为在磁盘上查找之前,它会尝试确定其数据库中的项目与请求的URL匹配。 Sitecore中的项目名称具有最大长度(您可以在配置文件中找到该设置)。因此,如果你的页面名称比你认为这个问题可能遇到的这个最大长度更长。

如果您想使用webmethods在Sitecore之外工作,我建议您设置正确的.svc或.asmx来托管您的JSON数据,而不是使用.aspx文件。这将导致Sitecore单独留下URL。如果您需要访问这些服务中的sitecore数据,请发表评论,我会在stackoverflow上将您指向正确的帖子。

答案 1 :(得分:1)

鉴于我在页面上的其他WebMethods工作,我使WebMethod名称更短,并且它工作。这是一个简单的解决方法 " SearchForAddress"和" SearchAddressBy"都工作。我还没有想出允许的最大长度。

我仍然不知道导致这个问题的原因。毫无疑问,这个地方有一个配置设置。解决方案的复杂性和代码库的脆弱性意味着我不准备在配置级别搜索或更改任何内容,但是我希望这种快速修复可以帮助其他开发人员解决类似的问题。