Я пытаюсь написать программу 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, где проблема может быть просто замечена, и процесс может пропустить этот вызов и перенести
Вместо этого на этом этапе вся программа завершается сбоем.
Любые мысли о том, как обойти это, приветствуются.