【问题标题】:Formatting JSONP for cross domain webservice in Jquery在 Jquery 中为跨域 Web 服务格式化 JSONP
【发布时间】:2012-12-28 23:59:57
【问题描述】:

我在外部域上有网络服务,其中包含一个用于发送邮件的网络服务

我想使用jquery ajax调用跨域web-service,问题是我无法获取成功值,即使webservice已经成功执行并且邮件已经发送也会报错

我签入了萤火虫(网络选项卡),在执行它时会附加 ?callback=[some junk function],因为它没有找到该函数,所以它没有显示正确的消息。

下面是我的网络方法
[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));
            }
        });

通过更改返回值并添加回调,我得到以下来自服务器的回复 但即使在成功发送邮件之后,它仍然会进入错误回调。 谁能告诉我如何格式化成功消息。

【问题讨论】:

  • 请注意,我在您的屏幕截图中看到的响应是 XML 而不是 JSON,并且没有包含在方法调用中...

标签: asp.net jquery jsonp


【解决方案1】:

您需要将响应数据包装在与SomeJunkFunction 同名的函数中。比如……

SomeJunkFunction() {return {"SomeProperty":"SomeValue"}};

至于为什么需要这个...

同源策略防止跨域查询返回数据。要解决此问题,您可以模拟包含一个外部 javascript 文件。模拟的 JS 文件有一个返回数据的函数。浏览器假定该函数是静态且合法的,因此允许它运行。

为了让客户端知道“静态”js 中提供的函数的名称,它会在调用中传递它,例如 SomeJunkFunction 并相信您创建的新函数将以这种方式命名。

有关更多信息和一些示例代码,请参阅This page

编辑:澄清一下,您不会在页面本身上创建SomeJunkFunction,它需要包含在服务器的响应中。它没有参数。您的服务器不返回数据,它返回一个函数,调用该函数时返回数据。

【讨论】:

  • 我已经更新了我的问题,即使进行了上述更改,它也只是调用错误回调。
  • 您能否在您的错误回调中将e 的全部详细信息添加到您的Q 中?听起来您的 AJAX 调用正在返回非 HTTP 200 响应
  • 它来自我遇到的某个站点,我将其更改为 (data) 和 data.responseText
【解决方案2】:

您收到错误状态是因为您没有返回正确的 JSONP。为了完成一个跨域 JSONP 请求,您必须返回包装在 jQuery 生成的回调函数中的请求。如果 jQuery 没有收到包裹在这个函数中的响应,那么成功回调将永远不会被触发。

改变

 return returnVal;

 return "[callback]({status: [returnVal]})";

【讨论】:

  • 我已经更新了我的问题,即使在进行了上述更改后,它也只是调用错误回调。
猜你喜欢
  • 2012-02-11
  • 2013-05-15
  • 2012-12-23
  • 2012-09-14
  • 2013-05-10
  • 2013-04-04
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多