我使用Checkout.com .NET SDK将我的应用程序与REST API集成。我编写了一个概念验证应用程序,一切正常,但是当我尝试从实际应用程序尝试进行API调用时出现此错误:
“此实例已经启动了一个或多个请求。只能在发送第一个请求之前修改属性。”
我克隆了本地构建的源代码,用我的本地引用替换了nuget引用并进行了调试。创建WebRequestHandler时抛出异常:
requestHandler = new WebRequestHandler
{
AutomaticDecompression = DecompressionMethods.GZip,
AllowAutoRedirect = false,
UseDefaultCredentials = false,
UseCookies = false
};
该应用程序使用的是.NET 4.0,Microsoft.Net.HTTP 2.2.29。我可以找到进一步挖掘的代码的唯一地方是symbolsource.org。在HttpClientHandler中有一个volatile bool operationStarted,仅在调用Send时设置,如果在设置属性时修改属性,则抛出异常。
internal void CheckDisposedOrStarted()
{
CheckDisposed();
if (operationStarted)
{
throw new InvalidOperationException(SR.net_http_client_operation_started);
}
}
我确信这个代码在我第一次点击它之前没有被调用,所以我只能猜测我的应用程序中的某些东西其他人已经在使用HttpClient调用它并且它没有已被处置,但我不知道如何在不逐一解构申请的情况下找出原因,这是一项艰巨的任务。
我想调试Microsoft.Net.Http 2.2.29 for .NET 4.0代码以试图找到罪魁祸首但无法找到完整且可下载格式的源代码。我可以尝试从symbolsource.org上的代码构建它,但这并不理想。
有人可以指导我使用源代码吗?或者建议任何其他想法? 感谢。
答案 0 :(得分:0)
由于我从未使用过这个“Checkout.com .NET SDK”,所以无法弄清楚发生了什么 但是既然你已经在本地构建了它,那么如果你可以在任何使用HttpClient的地方添加带调用堆栈跟踪的日志,那将会很有帮助。因此,您将能够追踪意外的第一次呼叫的来源。
要获取堆栈信息,您可以使用此https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
但是在完成诊断后请将其删除,将这些日志留在生产代码中并不是很有帮助。
我收到完全相同的错误,但那是因为我打算在调用Azure API时重用HttpClient。所以这是一个不同的案例。