Avatar billede henrik_40 Juniormester
21. oktober 2014 - 15:39 Der er 1 kommentar og
1 løsning

Windows-service virker kun i debug-mode

Hej
Jeg har lavet en windowsservice som virker fint i debug mode, men når jeg installerer Windowsservicen starter og stopper den. Jeg har fundet ud af at fejlen må ligge i når jeg forsøger adgang til databasen:

Min App_config ser således ud:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>     
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
       
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="AccessDatabase" connectionString="data source=MERKUR;initial catalog=FIRMA;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

code:
                using (var db = new Model1())
                {
                    logService1.Log(logPathService1, Environment.NewLine + "FØR activityToCheck - " + DateTime.Now.ToLongDateString());
                    var activityToCheck = db.Activities.Where(a => a.ActivityClosed == false && a.FMI == true && a.SerialNumber.Length > 9)
                        .Select(a => new { ACTIVITYID = a.ActivityID, SERIALNUMBER = a.SerialNumber }).ToList();
                    logService1.Log(logPathService1, Environment.NewLine + "EFTER activityToCheck - " + DateTime.Now.ToLongDateString());
                    foreach (var act in activityToCheck)

                        listofFMI.Add(new KeyValuePair<int, string>(act.ACTIVITYID, act.SERIALNUMBER));
                }
                logService1.Log(logPathService1, Environment.NewLine + "EFTER USING - " + DateTime.Now.ToLongDateString());
                logService1.Log(logPathService1, Environment.NewLine + "listofFMI ANTAL - " + listofFMI.Count);


Jeg har lavet log-filer og jeg får ikke "EFTER activityToCheck" i min log, så jeg formoder at fejlen må ligge i databasetilgang?
Så hvordan får jeg den til at virke ved installation, når den virker i debug-mode?
Avatar billede henrik_40 Juniormester
22. oktober 2014 - 12:20 #1
Måske denne forklaring er bedre:


Jeg har lavet en windows-service, som fungerer fint i debug-mode, men når jeg installerer den ser det ud til at den fejler når den skal lave databasekald. Jeg har lavet en test-windows-service ekstra, hvor det ser ud til at jeg har ret.

Her er hvad jeg har gjort:
1) lavet et Entity Framework v.hj.a. Code-first (det skulle jeg nok ikke have gjort, er svært at vedligeholde):
Således:
http://channel9.msdn.com/Blogs/EF/Code-First-to-Existing-Database-EF6-1-Onwards-


2) lavet log-filer før og efter databasekaldet:

(jeg kan se at TEST.txt bliver dannet - altså før databasekaldet, men at aftersql.txt IKKE bliver dannet [altså EFTER databasekaldet])
        protected override void OnStart(string[] args)
        {
            System.IO.File.Create(AppDomain.CurrentDomain.BaseDirectory+ "onstart.txt");
            StreamWriter swtest = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "TEST.txt", true);
            swtest.WriteLine("Writing a test");
            swtest.Flush();
            swtest.Close();
         
            var db = new Model1();
            var activityToCheck = db.Activities.Where(a => a.ActivityClosed == false && a.FMI == true && a.SerialNumber.Length > 9)
    .Select(a => new { ACTIVITYID = a.ActivityID, SERIALNUMBER = a.SerialNumber }).ToList();

            int count = activityToCheck.Count();

            StreamWriter sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory +  "aftersql.txt", true);
            sw.WriteLine(Environment.NewLine + "Count =>  " + count.ToString());
            sw.Flush();
            sw.Close();
        }
Avatar billede henrik_40 Juniormester
14. november 2014 - 10:18 #2
Lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester