Развертывание и использование статического содержимого для использования со службой Windows - PullRequest
2 голосов
/ 24 августа 2011

Я пытаюсь создать службу Windows, которая извлекает данные из слоя доступа к данным Linq-to-SQL.Для DAL я использую внешние файлы сопоставления XML.

Кажется, что все идет хорошо, но после установки службы и ее запуска я получаю следующую ошибку:

Служба не может быть запущена.System.IO.DirectoryNotFoundException: не удалось найти часть пути 'C: \ Windows \ system32 \ Generated \ SpiSytelineMapping.xml'.

Прежде всего, я пытаюсь выяснить, почемуон ищет файл сопоставления в каталоге system32, а не в каталоге, где находится исполняемый файл службы.

Тем не менее, когда я зашел в каталог system32, я был удивлен, увидев, что файлы содержимого действительно были скопированы туда.

C:\Windows\System32\Generated>dir

 Directory of C:\Windows\System32\Generated

08/24/2011  02:32 PM    <DIR>          .
08/24/2011  02:32 PM    <DIR>          ..
08/24/2011  02:09 PM           447,079 AbcSytelineMapping.xml
08/24/2011  02:09 PM           442,374 HtiSytelineMapping.xml
01/19/2011  05:07 PM           445,155 MpiCorpSytelineMapping.xml
08/24/2011  02:09 PM           464,353 SpiSytelineMapping.xml
08/24/2011  02:09 PM           440,483 SytelineMapping.xml
               5 File(s)      2,239,444 bytes
               2 Dir(s)  56,826,531,840 bytes free

Поскольку файлы естьМоим первым предположением было то, что это проблема с разрешениями, но каталог и файлы имеют права на чтение для «Все», и я попытался запустить службу с правами «Администратор», «Локальная служба», «Локальная система» и моей учетной записью.(которая также является учетной записью администратора. Все не удалось с той же ошибкой.

Стоит отметить, что файлы также появляются в каталоге установки приложения с исполняемым файлом.

Может кто-нибудь пролить свето том, что может происходить здесь, что я скучаю?

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Хотя вышеприведенное работает, я обнаружил, что гораздо лучше встроить файл сопоставления в качестве ресурса и загрузить его оттуда следующим образом:

    private static string GetXmlMapping()
    {
        Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Mpicorp.SytelineDataModel.Generated.SytelineMapping.xml");
        StreamReader streamReader = new StreamReader(xmlStream);
        return streamReader.ReadToEnd();
    }

Это очень просто и намного элегантнее; мой уровень доступа к данным теперь намного проще развернуть. Я просто не знал об этом методе, когда сделал свой оригинальный пост. Возможно, это может быть полезно кому-то, у кого такая же дилемма.

1 голос
/ 25 августа 2011

Когда служба Windows запускается, она запускается в c: \ windows \ system32, возможно, вы можете сделать это при загрузке ваших сопоставлений:

string connStr = "server=.;database=AdventureWorksLT;integrated security=true;";
string currentPath=System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
using (CustomDataContext context = new CustomDataContext(connStr, XmlMappingSource.FromUrl(currentPath+"\\CustomerMapping.xml")))
{

}

Чтобы принудительно загрузить XML из текущего каталога, где находитсянаходится служба windows.

...