Обработка таймаутов и неправильных ответов с помощью restsharp в C # - PullRequest
0 голосов
/ 24 мая 2019

У меня есть кусок кода restsharp, написанный на c #, который выглядит следующим образом:

        Parallel.ForEach(list, marketplace =>
        {
            var findingKeyToUse = findingApiKeys[new Random().Next(findingApiKeys.Count())];
            var initialURL = "example.com/api";
            var client = new RestClient(initialURL);
            var request = new RestRequest(Method.GET);
            var xmldoc = new XMLDocument();
            xmldoc.LoadXML(client.Execute(request).Content);
        });

Примечание: ответ от API возвращается в формате XML;

В какой-то момент я заметил, что ответ от API искажен по неизвестной причине, по которой я не смог воспроизвести его с моей стороны. Исключение в основном выглядит так:

(Inner Exception #3) System.Xml.XmlException: The 'meta' start tag on line 7 position 2 does not match the end tag of 'head'. Line 9, position 3.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NodeData startTag)
   at System.Xml.XmlTextReaderImpl.ParseEndElement()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
   at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
   at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
   at System.Xml.XmlDocument.Load(XmlReader reader)
   at System.Xml.XmlDocument.LoadXml(String xml)
   at DB_Layer.CompetitorResearchDailyUpdater.<>c__DisplayClass4_0.<FetchRestItems>b__0(Int32 page) in ...
   at System.Threading.Tasks.Parallel.<>c__DisplayClass17_0`1.<ForWorker>b__1()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
   at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object )<---

Я подозреваю, что получаю это исключение, потому что запросы к API выполняются параллельно, когда несколько запросов отправляются за одну секунду.

Итак, я подумал о том, как лучше всего обработать это исключение, и чтобы я мог изящно его кодировать, чтобы мое приложение также могло обрабатывать будущие исключения, которые могут возникнуть во время выполнения запросов;

Чего я хотел бы добиться с помощью логики повторов, так это в случае с ex. возникает это исключение, когда запрос повторно отправляется на сервер для конкретного запроса этого параметра, который отправляется через этот URL:

example.com/api?parameterid=someid

Так что, если, например, произошло исключение для параметра idid = 12, я бы хотел, чтобы запрос был повторен для этого конкретного параметра.

Как мне этого добиться с помощью restsharp?

...