Проблема с вызовом консольного приложения (службы WCF) из webform

#c# #asp.net

#c# #asp.net

Вопрос:

Я использую ASP.net приложение webform для запуска существующего консольного приложения, которое получает все записи из базы данных и отправляет их через стороннюю службу WCF. Локально все работает нормально. Когда я запускаю приложение, оно открывает консоль, получает записи и отправляет их. Но теперь я перенес свои файлы на тестовый сервер вместе с exe-файлом и связанными с ним конфигурационными файлами. Но когда я получаю доступ к приложению через браузер (тестовый URL) Я снова и снова получаю одно и то же сообщение об ошибке и не вижу окна консоли. Иногда все работает нормально, но никогда два раза подряд.

Сообщение об ошибке является:

 "There was no end point listening at '.....svc' that could accept message. This is often caused by incorrect address or soap action. 

System.net.webexception. Remote name could not be resolved 
at System.Net.HttpWebRequest.GetRequestStream 
at System.ServiceModel.Channels.HttpOutput.Webrequest.HttpOutput.GetOutputStream()
  

Код, который я использовал в веб-форме для вызова консольного приложения, является:

 ProcessStartInfo p = new ProcessStartInfo();
p.Arguments = _updateNow.ToString();
p.FileName="something";
p.UseShellExecute = false;// tried true too without luck
Process.Start(p);
  

Сообщение об ошибке обозначает «нет конечной точки» и звучит так, как будто проблема со службой WCF, но если я дважды щелкну исполняемый файл в Test, проблемы не возникнет. В чем может быть возможная проблема или мне следует переделать функциональность консольного приложения в мое основное приложение webform?

Обновление: после добавления потока.Переход в спящий режим (3000) после завершения процесса.Запустите (p), у меня нет проблем. Похоже, что основное приложение не ожидает завершения пакетного процесса. Как решить эту проблему?

Комментарии:

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

2. Также можете ли вы уточнить, в каком процессе размещена служба WCF, а какой вызывает службу WCF?

3. Консольное приложение вызывает внешнюю службу wcf. Я вызываю консольное приложение из asp.net приложение.

Ответ №1:

Похоже, что существует небольшая задержка между запуском консольного приложения и инициализацией веб-службы WCF и ее доступностью для использования — этого следовало ожидать.

Вы могли бы либо:

  • Решите проблему с помощью Thread.Sleep() и, возможно, с помощью пары блоков catch — retry.
  • Вы могли бы заставить консольное приложение сообщать процессу создания, когда оно будет готово к приему запросов (например, записав его в стандартный вывод и используя перенаправленные потоки).

Однако на данном этапе я бы, вероятно, немного пересмотрел архитектуру — запуск нового процесса является относительно дорогостоящим, и, кроме того, инициализация WCF serice также является относительно дорогостоящей. Если это выполняется один раз за запрос, то, помимо вышеуказанных проблем с синхронизацией, вы также подвергаетесь снижению производительности.

Невозможно ли немного изменить архитектуру, чтобы для всех запросов использовался один внешний процесс (например, служба Windows) вместо того, чтобы каждый раз запускать новый процесс?