例外:此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性

时间:2017-09-21 08:53:48

标签: c# asp.net .net dotnet-httpclient

我使用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上的代码构建它,但这并不理想。

有人可以指导我使用源代码吗?或者建议任何其他想法? 感谢。

1 个答案:

答案 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。所以这是一个不同的案例。