it-swarm.com.de

RestSharp Timeout funktioniert nicht

Ich habe einen Restsharp-Client und eine Anfrage wie folgt eingerichtet:

var request = new RestRequest();
request.Method = Method.POST;
request.AddParameter("application/json", jsonBody, ParameterType.RequestBody);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
request.Timeout = -1;
request.ReadWriteTimeout = -1;
var url = $"http://{ipAddress}/api/calculate";
var client = new RestClient();
client.BaseUrl = new Uri(url);
client.Timeout = -1;
client.ReadWriteTimeout = -1;
var response = client.Execute(request);

Diese Anfrage wird eine Weile dauern, etwa 30 Minuten. Nun, ich weiß, dass es elegantere Wege gibt, dies zu tun, aber für diese Anfrage muss ich es so machen.

Dieser RestSharp-Client und diese Anforderung werden innerhalb des Windows-Diensts ausgeführt. Wenn der Dienst die Anforderung ausführt, wird TimoutException ausgelöst und das maximale Zeitlimit für die Anforderung beträgt etwa 40 Sekunden.

Aus irgendeinem Grund funktioniert das von mir eingestellte Timeout für diesen Fall nicht.

Hat jemand eine Lösung dafür?

5
Miljan Vulovic

Möglicherweise tun Sie nicht das, was Sie Ihrer Meinung nach tun, indem Sie den Wert ReadWriteTimeout einstellen. Ihr Wert wird ignoriert, damit Sie den Standardwert erhalten.

Entsprechend dieser Antwort Was ist der Standardwert für das Zeitlimit von RestSharp RestClient? RestSharp verwendet HttpWebRequest in seiner Implementierung.

Die Timeout-Eigenschaft für HttpWebRequest darf nicht negativ sein HttpWebRequest.Timeout-Eigenschaft .

Wenn Sie in den RestSharp-Clientcode schauen, sehen Sie Folgendes: https://github.com/restsharp/RestSharp/blob/70de357b0b9dfc3926c95d1e69967c7a7cbe874c/RestSharp/RestClient.cs#L452

        int readWriteTimeout = request.ReadWriteTimeout > 0
            ? request.ReadWriteTimeout
            : this.ReadWriteTimeout;

        if (readWriteTimeout > 0)
        {
            http.ReadWriteTimeout = readWriteTimeout;
        }
7
Ken Brittain

So ändern Sie die Standarddauer für das Zeitlimit:

so ändern Sie das Standard-Timeout auf: 5 Sekunden (z. B. 5000 Millisekunden): 

    var client = new RestClient(BaseUrl);
    client.Timeout = 5000; // 5000 milliseconds == 5 seconds

Das ist es und ich hoffe das hilft!

1
BKSpurgeon