我有一个像这样定义的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。
我怎样才能调试那里的内容?
感谢您的任何建议。
答案 0 :(得分:1)
您无法从JavaScript端进入,但在VS2017中,您可以在SpeechSynthesizer
(或任何其他任何构造函数/方法)的任何构造函数/方法上设置断点。你的服务器端类)。当您从使用该构造函数/方法的Chrome发出请求时,VS2017将在断点处停止,让您逐步执行逻辑。