我在外部域上有web服务,其中包含用于发送邮件的Web服务
我想使用jquery ajax调用跨域web服务,问题是我无法获得成功值,即使webservice已成功执行且邮件已发送,也会出错
我检查了firebug(Net Tab),执行它时附加了?callback = [some junk function],因为它没有找到该功能,所以它没有显示正确的消息。
下面是我的webmethod
[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
public string SendMail()
{
string returnVal = string.Empty;
try
{
MailMessage message = new MailMessage();
message.From = new MailAddress("[from]");
message.To.Add("[to]");
message.Subject = "TEST";
message.Body = "TEST MAIL";
message.Priority = MailPriority.High;
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.Credentials = new NetworkCredential("[username]", "[password]");
client.Send(message);
returnVal = "[mycallback]({'status':'Success'})";
}
catch (System.Exception ex) { returnVal = "[mycallback]({'status':'Fail Reason: " + ex.Message + "'})"; }
return returnVal;
}
以下是我的ajax jquery调用
$(document).ready(function(){
$.ajax({
type:"GET",
url:"http://audiomedia.dev.asentechdev1.com/MailSender.asmx/SendMail",
dataType:"jsonp",
jsonpCallback: 'mycallback',
success: function(data){
alert(json.Parse(data));
},
error: function (data) {
alert("Error: " + data.responseText);
}
});
function mycallback(data){
alert("CallBack: " + JSON.stringify(data));
}
});
通过更改返回值并添加回调,我得到服务器的回复 但即使成功发送邮件后,它仍会进入错误回调。 任何人都可以告诉我如何格式化成功消息。
答案 0 :(得分:1)
您需要将响应数据包装在与SomeJunkFunction
同名的函数中。例如...
SomeJunkFunction() {return {"SomeProperty":"SomeValue"}};
至于为何需要......
相同的源策略可防止跨域查询返回数据。要解决此问题,您需要模拟包含外部JavaScript文件。模拟的JS文件具有返回数据的功能。浏览器假设该功能是静态且合法的,因此允许它运行。
要让客户端知道“静态”js中提供的函数的名称,它会在调用中传递它,例如SomeJunkFunction
,并相信您创建的新函数将以这种方式命名。
有关更多信息和一些示例代码,请参阅This page。
编辑:为了澄清,您不在页面本身上创建SomeJunkFunction
,它需要包含在服务器的响应中。它没有参数。您的服务器不返回数据,它返回一个函数,该函数在被调用时返回数据。
答案 1 :(得分:0)
您收到错误状态,因为您没有返回正确的JSONP。为了完成跨域JSONP请求,您必须返回包装在jQuery生成的回调函数中的请求。如果jQuery没有收到包含在此函数中的响应,则永远不会触发成功回调。
更改
return returnVal;
到
return "[callback]({status: [returnVal]})";