调试从JavaScript调用的.cs文件

时间:2018-03-29 16:06:45

标签: javascript c# asp.net visual-studio-2017

我有一个像这样定义的Default.aspx,我使用Chrome调试(通过点击&#34在VS2017中启动;在浏览器中显示(谷歌浏览器)"。

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="DevelopmentWithADot.AspNetSpeechSynthesizer.Test.Default" %>
<%@ Register Assembly="DevelopmentWithADot.AspNetSpeechSynthesizer" Namespace="DevelopmentWithADot.AspNetSpeechSynthesizer" tagPrefix="web" %>
<%@ Register Assembly="System.Speech, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Speech" TagPrefix="web" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script>

        function onSpeak(text)
        {
            //document.getElementById('synthesizer').speak(text);
            var nSynth = document.getElementById('synthesizer');

            if (nSynth == null)
            {
                debugger; //In internet explorer debugger will be hit directly (if you put a breakpoint). In google chrome, debugger will be hit if the developper tools is open.
                alert('Synthesizer is null!');
            }

            nSynth.speak(text);// I would like to debug what's going on here, but VS doesn't step into my breakpoints in "SpeechSynthesizer.cs"
        }

    </script>
</head>
<body>
    <form runat="server">
    <div>
        <web:SpeechSynthesizer runat="server" ID="synthesizer" Age="Adult" Gender="Male" Culture="en-US" Rate="0" Volume="100" />
        <input type="text" id="text" name="text"/>
        <input type="button" value="SpeakIt" onclick="onSpeak(this.form.text.value)"/>
    </div>
    </form>
</body>
</html>

我现在想调试SpeechSynthesizer.cs中发生的事情(因为我没有听到任何输出,我想找出原因)。

所以我想到的第一件事就是我需要进入如下定义的SpeechSynthesizer.cs:

using System;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Speech.Synthesis;
using System.Threading;
using System.Web.UI;
using System.Web.UI.HtmlControls;

namespace DevelopmentWithADot.AspNetSpeechSynthesizer
{
    [ConstructorNeedsTag(false)]
    public class SpeechSynthesizer : HtmlGenericControl, ICallbackEventHandler
    {
        private readonly System.Speech.Synthesis.SpeechSynthesizer synth = new System.Speech.Synthesis.SpeechSynthesizer();

        public SpeechSynthesizer() : base("audio")
        {
            this.Age = VoiceAge.NotSet;
            this.Gender = VoiceGender.NotSet;
            this.Culture = CultureInfo.CurrentCulture;
            this.VoiceName = String.Empty;
            this.Ssml = false;
        }

        [DefaultValue("")]
        public String VoiceName { get; set; }

        [DefaultValue(100)]
        public Int32 Volume { get; set; }

        [DefaultValue(0)]
        public Int32 Rate { get; set; }

        [TypeConverter(typeof(CultureInfoConverter))]
        public CultureInfo Culture { get; set; }

        [DefaultValue(VoiceGender.NotSet)]
        public VoiceGender Gender { get; set; }

        [DefaultValue(VoiceAge.NotSet)]
        public VoiceAge Age { get; set; }

        [DefaultValue(false)]
        public Boolean Ssml { get; set; }

        protected override void OnInit(EventArgs e)
        {
            AsyncOperationManager.SynchronizationContext = new SynchronizationContext();

            var sm = ScriptManager.GetCurrent(this.Page);
            var reference = this.Page.ClientScript.GetCallbackEventReference(this, "text", String.Format("function(result){{ document.getElementById('{0}').src = result; document.getElementById('{0}').play(); }}", this.ClientID), String.Empty, true);
            var script = String.Format("\ndocument.getElementById('{0}').speak = function(text){{ {1} }};\n", this.ClientID, reference);

            if (sm != null)
            {
                this.Page.ClientScript.RegisterStartupScript(this.GetType(), String.Concat("speak", this.ClientID), String.Format("Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function() {{ {0} }});\n", script), true);
            }
            else
            {
                this.Page.ClientScript.RegisterStartupScript(this.GetType(), String.Concat("speak", this.ClientID), script, true);
            }

            base.OnInit(e);
        }

        protected override void OnPreRender(EventArgs e)
        {
            this.Attributes.Remove("class");
            this.Attributes.Remove("src");
            this.Attributes.Remove("preload");
            this.Attributes.Remove("loop");
            this.Attributes.Remove("autoplay");
            this.Attributes.Remove("controls");

            this.Style[HtmlTextWriterStyle.Display] = "none";
            this.Style[HtmlTextWriterStyle.Visibility] = "hidden";

            base.OnPreRender(e);
        }

        public override void Dispose()
        {
            this.synth.Dispose();

            base.Dispose();
        }

        #region ICallbackEventHandler Members

        String ICallbackEventHandler.GetCallbackResult()
        {

            using (var stream = new MemoryStream())
            {
                this.synth.Rate = this.Rate;
                this.synth.Volume = this.Volume;
                this.synth.SetOutputToWaveStream(stream);

                if (String.IsNullOrWhiteSpace(this.VoiceName) == false)
                {
                    this.synth.SelectVoice(this.VoiceName);
                }
                else
                {
                    this.synth.SelectVoiceByHints(this.Gender, this.Age, 0, this.Culture);                  
                }

                if (this.Ssml == false)
                {
                    this.synth.Speak(this.Context.Items["data"] as String);
                }
                else
                {
                    this.synth.SpeakSsml(this.Context.Items["data"] as String);
                }

                return (String.Concat("data:audio/wav;base64,", Convert.ToBase64String(stream.ToArray())));
            }
        }

        void ICallbackEventHandler.RaiseCallbackEvent(String eventArgument)
        {
            this.Context.Items["data"] = eventArgument;
        }

        #endregion
    }
}

但是,Google Chrome和VS2017都不允许我进入SpeechSynthesizer.cs。

我怎样才能调试那里的内容?

感谢您的任何建议。

ps:这是项目层次结构: enter image description here

1 个答案:

答案 0 :(得分:1)

您无法从JavaScript端进入,但在VS2017中,您可以在SpeechSynthesizer(或任何其他任何构造函数/方法)的任何构造函数/方法上设置断点。你的服务器端类)。当您从使用该构造函数/方法的Chrome发出请求时,VS2017将在断点处停止,让您逐步执行逻辑。