在Jquery中为跨域Web服务格式化JSONP

时间:2013-01-14 23:00:30

标签: asp.net jquery jsonp

我在外部域上有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));
            }
        });

通过更改返回值并添加回调,我得到服务器的回复 enter image description here 但即使成功发送邮件后,它仍会进入错误回调。 任何人都可以告诉我如何格式化成功消息。

2 个答案:

答案 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]})";