views:

233

answers:

5

We use ADP for employee information. I had to create a small app that called some web services that ADP has to pull employee information. The app is fairly procedural..not really object orientated in a sense. Basically I go through some web services to pull general information, work information, employee status, etc.

I have most of this data writing out to a text file as a log so I can ensure that everything is working correctly. Finally got it all done, and it works perfect on my local machine. Thought I'd just copy the entire structure onto a server and use windows scheduler to schedule the exe to run nightly (once a day). When it tries to run the app it looks like it is dying when it calls the first web service. The task scheduler log says:

""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)."

So I checked the event viewer and it says this:

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.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

I put in some console.writelines to see where it is failing...

Here is a simple example of 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();
         }

And inside of 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);
        }

I see all the console.writelines on the server but as soon as it hits this line from main:

EmpWorkInfo();

Thats when all hell breaks lose (basically it doesn't work). The EmpWorkInfo() is simply a function to get work related information from a web service (as I said this works locally).

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());
    }
}

This functions code is irrelevant (its ugly but do not let that bother you, the code works...). My issue is I cannot even get to the first console.writeline of that function. Is there anything special I need to do when it comes to working with webservices?

Edit

Logpath is defined as simply a static string outside of main:

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

Does logPath have a trailing backslash? Either way, you ought to use Path.Combine, rather than the string catenation operator (+).

Roger Lipscombe
logPath is defined as: private static string logPath = Environment.CurrentDirectory + "\\log\\";
JonH
I even tried:private static string logPath = @"\\myServerName\adp\ADP\bin\Debug\log\";
JonH
+1  A: 

I suspect that your application is not able to load the types referenced in that function - EmpWorkInfo.

1) Can you run this application on the target server in a commannd window (cmd.exe) ? 2) Are you using any assemblies from ADP that are installed in the global assembly cache (GAC)? Run "gacutil -l" on your localmachine to see if you are using any assemblies from ADP that are installed in thr gac. If they are, you will need to install these into the machine on which you are running the app.

feroze
Ack I think i know what the issue is looks to be related to Microsoft.Web.Services3. Looks like I need that dll installed on the server?
JonH
A: 

What happens if you comment out all the code in EmpWorkInfo() apart from the first Console.Writeline? Does it still not get written out?

Paul Manzotti
A: 

Found out I need the Microsoft.Web.Services3 dll installed on the server.

JonH
A: 

Continuation on "feroze" answer;

If you want to figure out if the 'loading of dependencies' is causing you grief here, i suggest using the "FUSLOGVW.EXE" tool *(part of .Net). When you run this it will give you a little dialog window with a few options. Create a directory somewhere (like "c:\temp\fusion_logs"), set the mode of FUSLOGVW to "log bind failures only", "custom location->c:\temp\fusion_logs".

Now restart your application and check that it failed. Now look into your fusion_logs directory. This should give you sub directories with different (maybe only 1 for now) application names. Inside each directory you will find the log files. These log files contain the "failed assembly loads" and who (which calling assembly) caused them.

They might help your hunt for a working application,

Hope this helps,

Edit: Posted this after you found the cause. The fuslogvw.exe would have shown you the missing assembly.

Marvin Smit
@Marvin: was this in response to http://stackoverflow.com/questions/2247218/c-webservice-app-on-server-throwing-strange-exception/2247308#2247308? He's already solved the problem.
John Saunders
Yes it was, hence me editing the post. Still think that the `fuslogvw.exe` is usefull information to remember for the next occurance of something similar.
Marvin Smit