Веб-приложение ASP.NET - при развертывании объект System.Speech.dll не задан для экземпляра объекта

У меня есть веб-приложение ASP.NET, которое использует System.Speech для преобразования текста в файл WAV. Локально работает, но когда я развертываю его на сервере, я получаю сообщение об ошибке ниже. Это использует Windows Server 2012, ASP.NET 4.5 и IIS 8.5:

Object reference not set to an instance of an object.
System.Speech
   at System.Speech.Internal.ObjectTokens.RegistryDataKey..ctor(String fullPath, RegistryDataKey copyKey)
   at System.Speech.Internal.ObjectTokens.SAPICategories.DefaultDeviceOut()
   at System.Speech.Internal.Synthesis.VoiceSynthesis..ctor(WeakReference speechSynthesizer)
   at System.Speech.Synthesis.SpeechSynthesizer.get_VoiceSynthesizer()
   at QuinnSDS.handlerTransform.<>c__DisplayClass6.<ProcessRequest>b__1()

Код, который генерирует это сообщение об ошибке, выполняется на сервере:

if (context.Request.ContentLength > 0)
{
    string line = new StreamReader(context.Request.InputStream).ReadToEnd();
    // *********  generate wav file voicing the response *****************
    // Using Microsoft voices
    // initiate new instance of speech synthesizer
    Thread t = new Thread(() =>
    {
        try
        {
            // The object creation works fine
            System.Speech.Synthesis.SpeechSynthesizer synth = new System.Speech.Synthesis.SpeechSynthesizer();  
            if (synth != null)
            {
                // The code breaks at synth.GetInstalledVoices() below. It will break any time I try to do anything with the synth object
                foreach (System.Speech.Synthesis.InstalledVoice voice in synth.GetInstalledVoices())  
                {
                                    System.Speech.Synthesis.VoiceInfo info = voice.VoiceInfo;
                                    string voiceName = info.Name;
                                    ws.WriteLine(voiceName);
                 }
             }
         }
         catch (Exception e)
         {
             ws.WriteLine(e.Message);
             ws.WriteLine(e.Source);
             ws.WriteLine(e.StackTrace);
         }
         //... code continues...

Он не разрушается при создании объекта "Синтез речи"; он ломается всякий раз, когда я пытаюсь использовать этот объект любым способом.

Я не уверен, является ли это проблемой доступа, но я довольно плохо знаком с ASP.NET и IIS, и я не могу понять, как предоставить веб-приложению доступ к GAC или даже в этом проблема. Я пытался изменить свойство Local Copy для ссылки System.Speech на True в Visual Studio перед развертыванием приложения, но это не сработало. Я искал в Интернете, и хотя "ссылка на объект, не установленная для экземпляра объекта", кажется довольно распространенной, я не могу найти каких-либо подобных проблем, связанных с библиотекой классов.NET Framework... Я запустил text-to- речевой код локально на сервере и работает нормально. Я не запускал все приложение локально на сервере, потому что веб-приложение требует речевого ввода и на сервере нет микрофона.

Любые идеи о чем-либо, чтобы попробовать

1 ответ

Решение

Под какой учетной записью запускается код при запуске из ASP.NET? Если Speech API касается реестра, как предполагает стек вызовов, возможно, он имеет другие разрешения, чем учетная запись, которую вы использовали для запуска кода вручную.

Если вы не можете просто запустить пул приложений для своего сайта с той же учетной записью, с которой вы входите в систему, я добился определенного успеха, используя Process Monitor для отслеживания подобных проблем. В основном, выполняйте код, который завершается с ошибкой во время работы Process Monitor, и ищите "ACCESS DENIED" в столбце "Result" (или что-либо еще, что выглядит подозрительно). Однако быстрое переключение пула приложений на использование стандартной учетной записи пользователя будет самым быстрым способом исключить проблемы, связанные с безопасностью или разрешениями.

Другие вопросы по тегам