如何处理来自 API 调用的“Unexpected EOF at target”错误?

Posted

技术标签:

【中文标题】如何处理来自 API 调用的“Unexpected EOF at target”错误?【英文标题】:How to handle "Unexpected EOF at target" error from API calls? 【发布时间】:2019-05-06 22:17:18 【问题描述】:

我正在创建一个 Forge 应用程序,它需要从 BIM 360 中心获取版本信息。有时它可以工作,但有时(通常在代码已经运行一次此会话之后)我收到以下错误:

Exception thrown: 'Autodesk.Forge.Client.ApiException' in mscorlib.dll
Additional information: Error calling GetItem: 
  "fault":
    "faultstring":"Unexpected EOF at target",
    "detail": 
      "errorcode":"messaging.adaptors.http.flow.UnexpectedEOFAtTarget"
    
  

上述错误将在调用 api 时抛出,例如以下之一:

dynamic item = await itemApi.GetItemAsync(projectId, itemId);
dynamic folder = await folderApi.GetFolderAsync(projectId, folderId);
var folders = await projectApi.GetProjectTopFoldersAsync(hubId, projectId);

其中api初始化如下:

ItemsApi itemApi = new ItemsApi();
itemApi.Configuration.AccessToken = Credentials.TokenInternal;

在抛出此错误和未抛出此错误时,ID(例如“projectId”、“itemId”等)似乎没有任何不同,所以我不确定是什么导致了错误.

我的应用程序基于本教程的 .Net 版本:http://learnforge.autodesk.io/#/datamanagement/hubs/net

但我对其进行了调整,因此我可以异步检索多个节点(例如,用户有权访问的所有节点)而无需更改 jstree。我这样做是为了允许在后台提取信息而不会中断用户的工作流程。我所做的主要更改是在服务器端添加另一个路由,它在树的根部异步调用“GetTreeNodeAsync”(来自教程),然后在每个返回的子节点上调用它,然后是每个子节点,等等在。该函数等待直到使用Task.WhenAll处理完所有节点,然后将每个节点的数据返回给客户端;

这意味着可能有许多 api 调用异步运行,如果一个节点已经在 jstree 中打开,然后请求它的信息用于后台提取,或者如果后台提取发生超过一次。这似乎是最有可能发生错误的时候。

我想知道是否有其他人遇到过这个错误,如果你知道我可以做些什么来避免它,或者当它被捕获时如何恢复。目前,发生此错误后,似乎所有其他 api 调用也会引发此错误,我发现修复它的唯一方法是重新运行代码(我使用 Visual Studio,所以我只是重新运行服务器和客户端,我的浏览器会自动启动)

【问题讨论】:

【参考方案1】:

这些是我们的 apigee 路由器由于我们目前正在内部调查的授权过程中的延迟问题而导致的偶发错误。

当它们发生时,请停止所有即将发出的请求,等待几分钟,然后重试。看看像this 或this 这样的东西来帮助你。

我们现有的报告指出类似错误似乎指出并发是导致问题的因素之一,因此您可能还希望限制并发请求并查看是否可以缓解问题。

【讨论】:

以上是关于如何处理来自 API 调用的“Unexpected EOF at target”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 http 错误(FormatException: Unexpected end of input (at character 1))

Unexpected EOF 远程主机强迫关闭了一个现有的连接 如何处理

okhttp:如何处理来自服务器的未请求/意外 100(继续)响应?

如何处理进行中的请求以使用redux saga显示加载程序?

你如何处理来自 AJAX 调用的错误?

SVN触发构建后如何处理来自Teamcity服务器本身的api