我使用 ASP.net(C#、.Net Framework 4.0)开发了一个 Web 应用程序,在应用程序的某些部分我调用 API 来获取一些信息。我注意到某些 API 调用失败,并收到此错误:
索引超出了数组的范围。
当我检查堆栈跟踪时,我看到了这个:
在System.Collections.Generic.Dictionary2.Insert(TKey键,TValue值,布尔添加)
在 System.Collections.Generic.Dictionary2.set_Item(TKey 键,TValue 值)
在 Navitaire.Ncl.Validation.ValidationManager.getValidationAttributes(MemberInfo mi,布尔值和跳过)
在 Navitaire.Ncl.Validation.ValidationManager.validate(对象声明对象,对象值,MemberInfo mi,List1 结果)
在 Navitaire.Ncl.Validation.ValidationManager.Validate(对象 obj)
在 Navitaire.Ncl.ServiceModel.ParameterValidationInspector.BeforeCall(字符串操作名称,对象 [] 输入)
在 Navitaire.Ncl.ServiceModel.Remoting.BoilerplateSinkBase.InvokeBeforeCallInspectors(StateData stateData,RemotingMessage&消息)
在 Navitaire.Ncl.ServiceModel.Remoting.BoilerplateServerSink.ProcessMessage(IServerChannelSinkStacksinkStack、IMessage requestMsg、ITransportHeaders requestHeaders、Stream requestStream、IMessage& responseMsg、ITransportHeaders& 响应头、流和响应流)
在System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack,IMessage requestMsg,ITransportHeaders requestHeaders,流requestStream,IMessage&responseMsg,ITransportHeaders& 响应头、流和响应流)
我在捕获异常部分放置了一个断点,因此每次出现错误时,应用程序都会停止,我可以读取异常。我注意到,如果此时我再次调用 API(将光标移动到 API 调用行),它就可以正常工作。所以这意味着我传递给 API 的参数没有问题。
我尝试在三个不同的环境中运行该应用程序,具有完全不同的网络和不同的互联网连接,但仍然遇到相同的错误。
有人可以帮我解决这个案子吗?
我怀疑这是 API 的问题,而不是你的代码的问题,特别是如果它在你第二次进行相同的调用时有效。
我相信 API 正在使用内部字典做一些事情,第一次调用它时它并没有完全正确设置,但到第二次时,它已经“正确”地工作了。
您是否能够查看/访问您调用的 API 方法的代码?
如果是这样,您最好在应用程序旁边的调试中运行它,在该方法的入口处放置一个断点,并单步执行其中的行以查看它正在做什么以及为什么它可能会中断。
如果是你的API,或者你被允许分享这个方法的代码,但你自己找不到错误,请将API方法的代码贴出来,我会帮你找到可能的原因。
如果您无法查看代码,我建议联系 API 的生产者(如果它是私有 API,或者如果它是开源 API),请共享链接并提供您的代码的代码示例(显示您如何进行 API 调用),我们可以帮助诊断。
我与 API 开发人员进行了检查,发现他们修复了错误后出现了一些问题,但我没有再收到任何错误。