Проблема с ошибкой SOAP api, которая не была обнаружена обработчиками исключений - отображает «Это приложение в режиме прерывания» - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь написать программу C#, которая взаимодействует с Objective Electroni c Системой управления документами [EDRMS] [см. https://objective.com/] с использованием ее webtalk SOAP api.

Одна из вещей, которые мне нужно сделать, это создать папку. Для этого я вызываю API-интерфейс createRequest

Проблема заключается в том, что [иногда], когда я пытаюсь создать папку, папка, которую я хочу использовать в качестве родительской, не может иметь папки указанного типа.

Эта проблема ожидается в контексте выполнения программы, и ее легко избежать.

Это относится к папкам, которые были созданы в среде UAT, которая затем была обновлена ​​с производства - это означает, что некоторые идентификаторы папок, которые мы записали в нашей системе DEV / UAT, относятся к папкам, которые больше не существуют в цели UAT окружающая обстановка. Таким образом, вполне ожидаемо, что он потерпит неудачу, когда будет предпринята попытка создать подпапку с родительской папкой, которая не может принимать подпапки.

Обновление нашей системы DEV / UAT для соответствия производству не является прямо сейчас, поэтому мне нужно просто обрабатывать эти ошибки, пропуская их при возникновении проблемы.

Что я хочу сделать, так это перехватить это исключение при его возникновении и корректно обработать ситуацию.

Проблема, с которой я столкнулся, заключается в том, что независимо от того, сколько обработчиков исключений try / catch я размещаю вокруг кода, вызывающего веб-службу, C# не удается его перехватить, и Visual Studio отображает диалоговое окно с сообщением «Это приложение в режиме прерывания »и выдает необработанное исключение

Я смотрел на этот вопрос

Студия Visual Studio 2017 показывает ошибку« Это приложение находится в режиме прерывания »и выдает необработанное исключение

но настройки, которые он предлагает настроить, на самом деле не останавливают работу программы.

Этот вопрос также не помог мне:

Обработчики не обрабатывают необработанное исключение

, так как программа, которую я запускаю, является консольным приложением - мое консольное приложение использует только один поток.

Код, по которому возникает ошибка:

    ...
    createService.Url = URL_BASE + "/services/create";
    // other code to set up the create service [which works just fine for many other calls]
    ...
    createRequest createRequest = new createRequest();
    // code to add the folder details to the create request


    try
    {
        createResult = createService.send(createRequest);  // <--- Problem occurs when we call the send method to call the soap api
    }
    catch (FaultException fe)
    {
        string message =
        "Error when creating folder ";
        Logger.LogException(message, fe);
        throw new Exception(message, fe);
    }
    catch (SoapException se)
    {
        string message =
        "Error when creating folder ";
        Logger.LogException(message, se);
        XmlQualifiedName code = new XmlQualifiedName();
        throw new SoapException(message, code, se);
    }
    catch (Exception e)
    {
        string message =
        "Error when creating folder ";

        Logger.LogException(message, e);
        throw new Exception(message, e);
    }

При возникновении ошибки ни один из этих перехватов не перехватывает ошибку [включая последний. который должен перехватить все еще не перехвачено].

Вместо этого Visual Studio останавливается и отображает диалоговое окно с жалобой на необработанное исключение.

Обратите внимание, что метод "send" выглядит следующим образом:

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
    [return: System.Xml.Serialization.XmlElementAttribute("createsessionResult", Namespace="urn:objective.com")]
    public createsessionResult send([System.Xml.Serialization.XmlElementAttribute(Namespace="urn:objective.com")] createsessionRequest createsessionRequest) {
        object[] results = this.Invoke("send", new object[] {
                    createsessionRequest});
        return ((createsessionResult)(results[0]));
    }

Будем весьма благодарны за любые указатели. Отправка фактически вызывает службу SOAP, и в вызываемой службе происходит ошибка. Но то, что я хочу сделать, это обнаружить, что вызов не удался, и затем обработать ситуацию, распутывая обратно цепочку вызовов до точки обработки l oop, где проблема может быть просто замечена, и процесс может пропустить этот вызов и перенести

Вместо этого на этом этапе вся программа завершается сбоем.

Любые мысли о том, как обойти это, приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...