C# 如何从SendAsync异常中获取有意义的信息

C# 如何从SendAsync异常中获取有意义的信息,c#,.net,exception,httpclient,C#,.net,Exception,Httpclient,我已经编写了一些代码,可以向远程Web服务发送帖子。我已经尝试使用HttpClient.PostAync和HttpClient.sendaync,其中前者我只是提供了所有的东西,而后者我用适当的值构建了一个HttpRequestMessage。在今天的测试中,我遇到了一些异常。这两种实现都有相同的异常。可能是超时或远程端/传输上的其他错误。当我得到这个异常时,它会附带一个通用消息“任务被取消” 代码如下所示: using (MultipartFormDataContent

我已经编写了一些代码,可以向远程Web服务发送帖子。我已经尝试使用HttpClient.PostAync和HttpClient.sendaync,其中前者我只是提供了所有的东西,而后者我用适当的值构建了一个HttpRequestMessage。在今天的测试中,我遇到了一些异常。这两种实现都有相同的异常。可能是超时或远程端/传输上的其他错误。当我得到这个异常时,它会附带一个通用消息“任务被取消”

代码如下所示:

            using (MultipartFormDataContent formData = new MultipartFormDataContent())
            {
                //formData.Add(clientIDContent, "client_id");
                //formData.Add(clientSecretContent, "client_secret");
                formData.Add(quoteIDContent, "CPQuoteID");
                formData.Add(poNumContent, "PONumber");
                formData.Add(dealerNumContent, "DealerNumber");
                formData.Add(orderUserContent, "OrderingUser");
                formData.Add(fileContent, "order-file");

                try
                {
                    var response = await client.PostAsync(actionURL, formData);
                    int I = 0;
                }
                catch (Exception ex)
                {
                    int x = 0;
                }

            }
我返回的异常类型为TaskCanceledException。内部异常也不包含任何有意义的信息。一定有办法从中获得更好的信息。当我们的日志只包含这样的一般消息时,调试问题是令人沮丧的。我如何获得这些信息


只是多一点信息。我在这里的操作假设是HTTP客户机通过一个任务执行此操作。在某个时刻,任务超时。我不知道这是否是因为HTTP超时在某种程度上大于任务超时,或者HttpClient对象捕获超时异常并使用它,然后取消抛出取消异常的任务。无论哪种方式,似乎都失去了关于根本问题的有意义的信息。我想记录的信息。

如果我没记错的话,原因是超时,因为任务确实在超时后被取消。从远程服务器返回的HTTP错误不会抛出,但会显示为失败状态代码,而常规连接错误(包括超时)会抛出。这很令人困惑,特别是因为
SendAsync()
的注释说当“由于网络连接、DNS故障、服务器证书验证或超时等基本问题,请求失败。“但是,无论异常类型如何,您都会获得关于超时的哪些附加信息?我唯一能想到的就是知道超时是在连接期间还是在执行请求期间发生的。@TimMedora好吧,假设“任务被取消”意味着超时的问题是我可以真正取消任务。现在出现了歧义。是故意取消任务,还是发生了其他事情导致问题。。。就像暂停一样。我只是希望在某个我没有发现的地方,有什么东西可以说明为什么任务被取消了,或者类似的。此外,是的,MSDN文档没有帮助,因为它误导你认为你会得到一个异常,但实际上你会得到另一个。是的,我可以看出其中的模糊性。查看
HttpClient
的源代码,这方面似乎没有太多的灵活性。您可以设置一个无限超时,然后在n秒后发出您自己的取消命令来消除歧义。通过这种方式,您可以确定取消是因为超时还是因为调用堆栈上的其他原因。还有一种情况是远程服务器发出自己的超时并中断连接。“我想这与任务取消的表现形式是不同的。”提姆多拉:这主意不错,提姆。谢谢你的意见。我很感激。如果我没记错的话,原因是超时,因为任务在超时后确实被取消了。从远程服务器返回的HTTP错误不会抛出,但会显示为失败状态代码,而常规连接错误(包括超时)会抛出。这很令人困惑,特别是因为
SendAsync()
的注释说当“由于网络连接、DNS故障、服务器证书验证或超时等基本问题,请求失败。“但是,无论异常类型如何,您都会获得关于超时的哪些附加信息?我唯一能想到的就是知道超时是在连接期间还是在执行请求期间发生的。@TimMedora好吧,假设“任务被取消”意味着超时的问题是我可以真正取消任务。现在出现了歧义。是故意取消任务,还是发生了其他事情导致问题。。。就像暂停一样。我只是希望在某个我没有发现的地方,有什么东西可以说明为什么任务被取消了,或者类似的。此外,是的,MSDN文档没有帮助,因为它误导你认为你会得到一个异常,但实际上你会得到另一个。是的,我可以看出其中的模糊性。查看
HttpClient
的源代码,这方面似乎没有太多的灵活性。您可以设置一个无限超时,然后在n秒后发出您自己的取消命令来消除歧义。通过这种方式,您可以确定取消是因为超时还是因为调用堆栈上的其他原因。还有一种情况是远程服务器发出自己的超时并中断连接。“我想这与任务取消的表现形式是不同的。”提姆多拉:这主意不错,提姆。谢谢你的意见。我很感激。