.NET Web 应用程序异步调用从 VS 工作区代码在本地工作,但不是从服务器

问题描述 投票:0回答:2

我已经编写了从 API 获取数据的代码。我正在使用异步方法来处理检索数据的调用和处理。该代码由用户单击其起始页上的登录按钮触发。当异步方法在后台运行时,用户将被重定向到另一个 .NET Web 应用程序页面,即他们的主页。

当我从 VS 本地构建和运行网站时,所有代码都运行良好,返回数据,我的代码处理数据,将其添加到各种 SQL 表中。

myApiIntegration.Log($"GetDataFromAPI({querystring}, {displayInConsole}): Getting data from API")

Dim response As HttpResponseMessage = Await myApiRequest.GetResponse(querystring)

' only continue if request was successful, otherwise log an error
If Not response.IsSuccessStatusCode Then
      myApiIntegration.Log("ERROR: API request failed: " & response.ReasonPhrase)
      Return Nothing
Else
      myApiIntegration.Log("API request successful")
...

我已将我的代码签入测试服务器。网站构建完毕,由于我添加了一些日志记录,我可以看到当用户单击“登录”按钮时触发了我的代码,一直到 API 调用本身:我可以看到 Request 对象正在使用正确的标头等。我可以看到的最后一条日志消息是由 API 调用本身之前的最后一行创建的。用户仍然被重定向到他们的主页。

此后,我看不到来自异步代码的任何消息。我希望看到的下一条消息将是“API 调用成功”或“API 调用失败”,具体取决于 API 的响应(这些是我通过 Graylog 从代码中记录的消息,并且它们在本地工作) );但在告诉我即将进行 API 调用之后,没有进一步的消息。

我已检查服务器日志是否有错误。登录并运行API代码时没有任何内容。 我已经要求我们的基础设施人员检查防火墙的消息 - 他看不到任何消息 - 但当请求从我的本地代码发出时他也看不到任何消息(并且这有效)。 我已检查本地工作区副本和服务器上的代码是否相同。是的。

有人可以建议我应该注意什么、可能出了什么问题,或者我可以尝试其他哪些途径吗?它是 Windows Server 2016 Datacenter VM。该应用程序是一个 .NET Framework Web 应用程序,用 VB.NET 编写。

.net windows vb.net asynchronous webforms
2个回答
0
投票

已修复。我的异步方法在我的本地工作区中完美运行,但它需要作为“后台工作项”排队才能在服务器上运行。在将框架升级到 .NET 4.5.2 后,我使用 QueueBackgroundWorkItem 来执行此操作,因为我的 Web 应用程序所针对的旧框架中的 HostingEnvironment 不支持 QueueBackgroundWorkItem 方法。

                Dim ct As New System.Threading.CancellationToken
                Dim func As Func(Of System.Threading.CancellationToken, Task(Of MyObjects)) = Function() myApiIntegration.GetDataFromAPI(Int(idStr))
                HostingEnvironment.QueueBackgroundWorkItem(func)

0
投票

请求外部代码的正确解决方案是使用带有后台服务的持久队列。虽然像

HostingEnvironment.QueueBackgroundWorkItem
这样的内存工作队列在一切正常时都可以正常运行,但如果服务器出现故障或滚动升级,它可能会丢失工作。

© www.soinside.com 2019 - 2024. All rights reserved.