0

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

我想使用 jquery ajax 调用跨域 web 服务,问题是我无法获得成功值,即使 web 服务已成功执行并且邮件已发送,它也会出错

我签入了萤火虫(Net Tab),在执行它时附加了?callback = [一些垃圾函数],并且因为它没有找到该函数,所以它没有显示正确的消息。

下面是我的网络方法

[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));
            }
        });

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

4

2 回答 2

1

您需要将响应数据包装在同名的函数中SomeJunkFunction。例如...

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

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

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

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

有关更多信息和一些示例代码,请参阅此页面

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

于 2013-01-14T23:03:51.723 回答
0

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

改变

 return returnVal;

 return "[callback]({status: [returnVal]})";
于 2013-01-14T23:06:26.957 回答