ExecuteAsync() 导致硬崩溃,无一例外

ExecuteAsync() causing hard crash with no exception

问题来了:什么会阻止此代码执行此 http 请求?

设置如下:我正在做一个有多个 API 的项目,这是一个在第一个到第二个中调用的方法以获取验证信息。理论上,该方法应该发出请求,将模型发送到第二个服务,然后 return 返回在此方法末尾 returned 的内容。

当 运行 两个 API 在本地都带有断点以查看它们是否被击中时,第二个永远不会被击中,因为当 ExecuteAsync() 行被击中时,它会严重崩溃,然后重新启动第一个 API。我不认为我在这里做错了什么,但它没有向我抛出任何类型的堆栈跟踪或异常,即使我将它放入 try/catch。这是一个已知问题还是我只是在这里做错了什么?

        public async Task<SharkTankValidationResponseModel> CheckIfValidRequest(SharkTankValidationModel requestModel)
        {
            // Setup rest client
            RestClient userRestClient = new RestClient(endpoint + "SharkTank/Validate");
            RestRequest userRequest = new RestRequest(Method.POST);
            // New request object for body

            userRequest.AddJsonBody(requestModel);
            // HTTP Request
            IRestResponse response = await userRestClient.ExecuteAsync(userRequest);
            return JsonConvert.DeserializeObject<SharkTankValidationResponseModel>(response.Content);
        }

在顶层,这就是它的名字。模型制作正确,没有问题,我可以在它硬崩溃之前一直逐步执行代码

                SharkTankValidationModel model = await makeSharkTankValidationModel(Method.GET, SharkTankConstants.GET_ALL_CLIENT_CATEGORY, null);
                SharkTankValidationResponseModel validationModel = await sharkTank.CheckIfValidRequest(model);

Gif 参考步骤 运行 通过调试器和突然崩溃 https://imgur.com/bWSR78h

根据 RestClient 的文档,如果 response.IsSuccessfulfalseExecuteAsync 不会抛出异常,而是填充 response.ErrorExceptionresponse.ErrorMessage。如果您不需要访问响应 StatusCode 并且只关心正文,只需使用 PostAsync<T> 即可。

public async Task<SharkTankValidationResponseModel> CheckIfValidRequest(SharkTankValidationModel requestModel)
{
    // Setup rest client
    RestClient userRestClient = new RestClient(endpoint);
    RestRequest userRequest = new RestRequest("SharkTank/Validate")
        .AddJsonBody(requestModel);
    // HTTP Request
    IRestResponse response = await userRestClient.PostAsync<SharkTankValidationResponseModel>(userRequest);
    return response;
}

好吧,在最终以一种让我在响应中看到异常的方式尝试之后想通了。错误如下:

ActualMessage: "A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles."
BytePositionInLine: null
ClassName: "System.Text.Json.JsonException"
Data: null
ExceptionMethod: null
HResult: -2146233088
HelpURL: null
InnerException: null
LineNumber: null
Message: "A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 64. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles."
Path: "$.requestorRoles.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.Claims.Subject.AuthenticationType"
RemoteStackIndex: 0
RemoteStackTraceString: null
Source: "System.Text.Json"
StackTraceString: "   at System.Text.Json.ThrowHelper.ThrowJsonExcep
WatsonBuckets: null

现在我用于模型的对象正在使用 Microsoft 的默认声明对象类型来传递声明。这显然使 json 序列化程序崩溃并一遍又一遍地循环,并且在发现循环时崩溃。

修复只是制作自定义对象类型以将这些声明映射到,实际上使用 3 种不同的 HTTP 方法调用类型中的任何一种都没有问题。长话短说,不要对事物使用默认声明类型。只是制造问题。