Приложение C # / Webservice на сервере выдает странное исключение - PullRequest
1 голос
/ 11 февраля 2010

Мы используем ADP для информации о сотрудниках.Мне пришлось создать небольшое приложение, которое называлось бы некоторыми веб-службами, которые ADP должен получать информацию о сотрудниках.Приложение является довольно процедурным ... на самом деле не ориентировано на объект.В основном, я обращаюсь к некоторым веб-службам, чтобы получить общую информацию, информацию о работе, статус сотрудника и т. Д.

У меня большая часть этих данных записывается в текстовый файл в виде журнала, чтобы я мог убедиться, что все работает правильно,Наконец-то все получилось, и он отлично работает на моей локальной машине.Думал, я просто скопирую всю структуру на сервер и использую планировщик Windows, чтобы запланировать запуск exe ночью (один раз в день).Когда оно пытается запустить приложение, оно выглядит как умирающее при вызове первого веб-сервиса.Журнал планировщика заданий говорит:

""ADP.job" (ADP.exe)
    Started 2/11/2010 2:14:34 PM
"ADP.job" (ADP.exe)
    Finished 2/11/2010 2:14:38 PM
    Result: The task completed with an exit code of (e0434f4d)."

Итак, я проверил просмотрщик событий, и он говорит следующее:

EventType clr20r3, P1 adp.exe, P2 1.0.0.0, P3 4b745bb9, P4 adp, P5 1.0.0.0, P6 4b745bb9, P7 289, P8 2d, P9 system.io.filenotfoundexception, P10 NIL.

Для получения дополнительной информации см. Центр справки и поддержки по адресу http://go.microsoft.com/fwlink/events.asp.

Я вставил некоторые console.writelines, чтобы увидеть, где он выходит из строя ...

Вот простой пример main:

 static void Main(string[] args)
        {
            OpenTextFile();

            Console.WriteLine("About to process employee work information...");
            tw.WriteLine("About to process employee work information...");
            //work info service
            EmpWorkInfo();
         }

И внутри файла opentextfile:

  public static void OpenTextFile()
        {
            //used to log data
            String sLogName;
            Console.WriteLine("Inside of opentextfile");
            if (Directory.Exists(logPath))
            {
                //directory exists
            }
            else
            {
                Directory.CreateDirectory(logPath);
            }
            Console.WriteLine("Inside of opentextfile2");
            sLogName = "log_" + DateTime.Today.ToString("MM_dd_yyyy") + ".txt";
            tw = new StreamWriter(logPath + sLogName);
        }

Я вижу все console.writelines на сервере, но как только он попадает в эту строку из main:

EmpWorkInfo();

То есть, когда проигрывают все адские перерывы (в основном это не так)т работа).EmpWorkInfo () - это просто функция для получения информации о работе из веб-службы (как я уже говорил, это работает локально).

static void EmpWorkInfo()
{
    Console.Writeline("THIS NEVER PRINTS!!!");
    SQLClass s=null;
    // Create the web service proxy client.
    GetEmployeeWorkInfoService oService = new GetEmployeeWorkInfoService();
    oService.Timeout = Int32.MaxValue;
    // Serialize the UsernameToken into XML.
    // Create the UsernameToken as defined in the WS-I secure profile.
    UsernameToken oUsernameToken = new UsernameToken(USERNAME, SECRET);

    System.Xml.XmlElement oSecurityHeaderXml =
    oUsernameToken.GetXml(new System.Xml.XmlDocument());

    ADP.GetEmployeeWorkInfoWebService.SecurityHeaderType oSecurityHeader = new ADP.GetEmployeeWorkInfoWebService.SecurityHeaderType();
    oSecurityHeader.Any = new System.Xml.XmlElement[] { oSecurityHeaderXml };
    oService.Security = oSecurityHeader;

    GetEmployeeWorkInfoRequestFilter oFilter = new GetEmployeeWorkInfoRequestFilter();

    //filter by thyssenkrupp company
    oFilter.Companies = new String[] { COMPANY_IDENTIFIER };

    GetEmployeeWorkInfoRequest oRequest = new GetEmployeeWorkInfoRequest();
    oRequest.Filter = oFilter;

    try
    {
        EmployeeWorkInfoType[] arPersonalInfo = oService.GetEmployeeWorkInfo(oRequest);
        try
        {
            s = new SQLClass();
        }
        catch (Exception e)
        {
            throw new System.Exception(e.Message.ToString());
        }

        for (int i = 0; i < arPersonalInfo.Length; i++)
        {

            String stID = arPersonalInfo[i].EmployeeKey.Identifier.EmployeeId;  //employee number
            String stEmailAddress = arPersonalInfo[i].WorkInfo.EmailAddress;    //employee email address (work)
            String stFax = arPersonalInfo[i].WorkInfo.Fax;                      //employee fax number
            DateTime dtHireDate = arPersonalInfo[i].WorkInfo.OriginalHireDate;

            String stPhone = arPersonalInfo[i].WorkInfo.Phone;                  //employee phone number
            String stWireless = arPersonalInfo[i].WorkInfo.Wireless;            //employee wireless number
            tw.WriteLine("Processing ID:" + stID + " Email Work: " + stEmailAddress + " Fax Work: " + stFax + " Hire Date: " + dtHireDate + " Phone Work: " + stPhone + " Wireless Work: " + stWireless + ".");
            Console.WriteLine("Processing ID:" + stID + " Email Work: " + stEmailAddress + " Fax Work: " + stFax + " Hire Date: " + dtHireDate + " Phone Work: " + stPhone + " Wireless Work: " + stWireless + ".");
            s.SetSQLCommand("dbo.ADP_uiEmployeeWorkInfo");
            s.AddSQLCmdParameter("@EmployeeNumber", System.Data.SqlDbType.VarChar, stID);
            s.AddSQLCmdParameter("@EmailAddress", System.Data.SqlDbType.VarChar, stEmailAddress);
            s.AddSQLCmdParameter("@Fax", System.Data.SqlDbType.VarChar, stFax);
            s.AddSQLCmdParameter("@HireDate", System.Data.SqlDbType.DateTime, dtHireDate);
            s.AddSQLCmdParameter("@Telephone", System.Data.SqlDbType.VarChar, stPhone);
            s.AddSQLCmdParameter("@Mobile", System.Data.SqlDbType.VarChar, stWireless);
            s.SQLExecuteNonQuery();                   

            Console.WriteLine("Processed ID:" + stID + " Email Work: " + stEmailAddress + " Fax Work: " + stFax + " Hire Date: " + dtHireDate + " Phone Work: " + stPhone + " Wireless Work: " + stWireless + ".");
            Console.WriteLine(Environment.NewLine);
        }
        s.CloseSQLDB();
        s.Dispose();
    }
    //catch any exception from adp side.
    catch (Exception e)
    {
        throw new System.Exception(e.Message.ToString());
    }
}

Этот код функции не имеет значения (он уродлив, но не позволяет этому беспокоить вас), код работает ...).Моя проблема в том, что я не могу даже добраться до первого console.writeline этой функции.Есть ли что-то особенное, что мне нужно сделать, когда дело доходит до работы с веб-сервисами?

Редактировать

Логический путь определяется как просто статическая строка вне main:

private static string logPath = Environment.CurrentDirectory + "\\log\\";

Ответы [ 5 ]

1 голос
/ 11 февраля 2010

Я подозреваю, что ваше приложение не может загрузить типы, на которые ссылается эта функция - EmpWorkInfo.

1) Можете ли вы запустить это приложение на целевом сервере в окне командной строки (cmd.exe)? 2) Используете ли вы какие-либо сборки из ADP, которые установлены в глобальном кэше сборок (GAC)? Запустите "gacutil -l" на вашей локальной машине, чтобы увидеть, используете ли вы какие-либо сборки из ADP, которые установлены в thr gac. Если это так, вам нужно будет установить их на компьютер, на котором вы запускаете приложение.

0 голосов
/ 11 февраля 2010

Продолжение ответа "feroze";

Если вы хотите выяснить, вызывает ли вас здесь «загрузка зависимостей», я предлагаю использовать инструмент «FUSLOGVW.EXE» * (часть .Net). Когда вы запустите это, вы увидите небольшое диалоговое окно с несколькими опциями. Создайте каталог где-нибудь (например, «c: \ temp \ fusion_logs»), установите режим FUSLOGVW на «только ошибки привязки журнала», «пользовательское расположение-> c: \ temp \ fusion_logs».

Теперь перезапустите приложение и убедитесь, что оно не удалось. Теперь загляните в каталог fusion_logs. Это должно дать вам подкаталоги с другими (может быть, только 1) именами приложений. Внутри каждого каталога вы найдете файлы журналов. Эти файлы журнала содержат «неудачные загрузки сборок» и кто (какая вызывающая сборка) вызвал их.

Они могут помочь вам в поиске работающего приложения,

Надеюсь, это поможет,

Редактировать: Написал это после того, как вы нашли причину. Файл fuslogvw.exe показал бы отсутствующую сборку.

0 голосов
/ 11 февраля 2010

Обнаружено, что мне нужна установленная на сервере DLL Microsoft.Web.Services3.

0 голосов
/ 11 февраля 2010

Что произойдет, если вы закомментируете весь код в EmpWorkInfo (), кроме первого Console.Writeline? Это все еще не выписано?

0 голосов
/ 11 февраля 2010

Имеет ли logPath обратную косую черту? В любом случае, вы должны использовать Path.Combine вместо оператора объединения строк (+).

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