在Javascript中调用webservice,为啥没有返回?
在Js中我使用xmlHTTP的GET方法,去调用我用.NET写的webservice,但奇怪的是在JS中调用send方法之后一直没有返回。(我在onreadystatechange的回调函数中设置了断点)。另外还有一点就是:我的webservice是关于Microsoft的TTS(Text-To-Speech)的,其中如果我调用如下两行代码,在JS中就无法得到返回值。但如果把它们注释掉,JS中就可以正常返回。有没有哪位能给点思路?多谢!
_speechSynthesizer.SetOutputToWaveFile(sOutPath);
_speechSynthesizer.Speak(sText);
--------------------编程问答-------------------- 这个问题困扰我很长时间了,如果能解决,我会再加分给你。 --------------------编程问答-------------------- 楼主,贴代码吧!! --------------------编程问答-------------------- 我现在在上班,代码在家里电脑。
客户端的JS是非常简单的,首先新建一个xmlHTTP对象,然后调用我那个webservice方法(send),并且我指定了onreadystatechange这个回调函数,所以正常情况下如果那个webservice返回的话,会进入这个回调函数继续执行。
webservice就更简单了,就是用.NET创建的,就一个函数,返回值是一个string。我在这个webservice
里调试过,无论是否调用那两个TTS的API,这个函数都会正常返回没抛异常,但奇怪的是:在调用那两个API的情况下,为啥这个返回值不会回到JavaScript那里?难道中途出了异常?或者是那两个API启动了新线程啥的?
有哪位遇到过这种不返回的情况,说说你们的发现,给我点启发。我想我的代码应该是没问题,不会有低级错误的。 --------------------编程问答-------------------- 检查一下你的webservice引用有没有问题 --------------------编程问答--------------------
我在在JavaScript中调用webservice,所以应该不存在引用的问题。基本的调用方式就是xmlHTTP的open方法,URL类似为"http://localhost/webservicesample/service.aspx/GetString?123abc",其中GetString是webservice方法的名字,123abc是这个方法所需要的传入参数。
还有一点,我为什么说引用没问题,因为我在这个GetString的方法中注释掉那两行之后,在JS中就可以成功调用并返回值。
看来这个问题有点复杂了,我也对这个问题能否被解决没信心了。 --------------------编程问答-------------------- 跨域有关系吗 --------------------编程问答-------------------- //_speechSynthesizer.SetOutputToWaveFile(sOutPath);
_speechSynthesizer.Speak("你好");
把_speechSynthesizer.Speak("你好"); 上面的注释掉..看看直接给值能不能调..
这是朗读文本的方法..不知道JAVASCRIPT调用是否涉及的安全方面或是权限的问题.. --------------------编程问答--------------------
跨域?其实我现在调试都在同一台电脑上。 --------------------编程问答--------------------
这倒是有可能,是否因为JavaScript的调用,产生服务器端磁盘文件读写,有权限问题?还真不太清楚。。 --------------------编程问答-------------------- 使用xmlHTTP的GET方法
webservice是否支持GET?
--------------------编程问答--------------------
用GET或POST,同步或异步都可以,已经测试过了。 --------------------编程问答--------------------
试过了,直接朗读“你好”,也不能返回,汗!看来真是无解了~~~ --------------------编程问答-------------------- 抓包看看数据时怎样的,有可能问题一下就解决了 --------------------编程问答-------------------- XMLHttp的使用是可以从远程得到返回值的,楼主可以仔细查一下。 --------------------编程问答--------------------
跨步跨域和在不在一台电脑上没关系,在一台电脑上,两个Web应用使用不同的域名发布,也同样是跨域的。跨域访问js会报没有权限。不过我感觉你的问题和这个没关系。打断点调试一下WebService,看有没有返回结果。 --------------------编程问答-------------------- 还是把我的code发上来大家给分析分析,主要是两部分:.Net写的Webservice和JavaScript里的调用
Webservice部分:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Speech.Synthesis;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
public string SayHelloTo(string Name) {
SpeechSynthesizer _ss= new SpeechSynthesizer();
_ss.SelectVoice("Microsoft Lily"); //这里可能需要安装语音库,不然没法调试
_ss.Speak("Hello, "+ Name);
return "Hello "+Name;
}
}
JavaScript部分:
<script language="javascript">
function RequestByGet(data){
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
//Webservice location.
var URL="http://localhost/WebSite6/Service.asmx/SayHelloTo?Name=Zach";
xmlhttp.Open("GET",URL, false);
xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=utf-8");
xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/SayHelloTo");
xmlhttp.Send(data);
var result = xmlhttp.status;
//OK
if(result==200) {
document.write(xmlhttp.responseText);
}
xmlhttp = null;
}
</Script>
--------------------编程问答-------------------- webservice 标记 [System.Web.Script.Services.ScriptService] // 在.NET 中
这样 webservice 就有支持 JavaScript 访问的能能力了.如果没有这个 JavaScript 是不能访问的.
其他 平台开发的 webservice 我就不知道了
.
补充:.NET技术 , Web Services