Форматирование JSONP для междоменного веб-сервиса в Jquery

у меня есть веб-сервис на внешнем домене, который содержит веб-сервис для отправки писем

I want to call cross-domain web-service using jquery ajax, the problem is i could not get the success value, it goes to error even if webservice has successfully executed and mail has been sent

я проверил в firebug (вкладка Net), при выполнении добавляется ?callback=[какая-то ненужная функция], и поскольку она не находит эту функцию, она не отображает правильное сообщение.

below is my 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));
            }
        });

с изменением возвращаемого значения и добавлением обратного вызова я получаю ниже ответ с сервера введите описание изображения здесь, но все равно он переходит в ошибка обратного вызова даже после успешной отправки почты. может ли кто-нибудь сказать мне, как можно отформатировать сообщение об успехе.


person Abbas    schedule 14.01.2013    source источник
comment
Обратите внимание, что ответ, который я вижу на вашем снимке экрана, представляет собой XML, а не JSON, и не заключен в вызов метода...   -  person Basic    schedule 15.01.2013


Ответы (2)


Вам нужно обернуть данные ответа внутри функции с тем же именем, что и SomeJunkFunction. Например...

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

А зачем это нужно...

Политика того же источника не позволяет запросам между доменами возвращать данные. Чтобы обойти это, вы имитируете включение внешнего файла javascript. Смоделированный файл JS имеет функцию, которая возвращает данные. Браузер предполагает, что функция является статической и легитимной, поэтому позволяет ей работать.

Чтобы клиент знал имя функции, предоставленной в «статическом» js, он передает его в вызове, например, SomeJunkFunction, и доверяет тому, что новая функция, которую вы создаете, будет называться таким образом.

Дополнительную информацию и примеры кода см. на этой странице.

Изменить. Чтобы уточнить, вы не создаете SomeJunkFunction на самой странице, его необходимо включить в ответ сервера. У него нет параметров. Ваш сервер не возвращает данные, он возвращает функцию, которая при вызове возвращает данные.

person Basic    schedule 14.01.2013
comment
Я обновил свой вопрос, даже после внесения вышеуказанных изменений, только его обратный вызов ошибки. - person Abbas; 15.01.2013
comment
Можете ли вы также добавить в свой вопрос полную информацию о e в обратном вызове ошибки? Похоже, ваш вызов AJAX возвращает ответ, отличный от HTTP 200 - person Basic; 15.01.2013
comment
это было с какого-то сайта, на который я наткнулся, я изменил его на (данные) и data.responseText - person Abbas; 15.01.2013

Вы получаете состояние ошибки, потому что не возвращаете правильный JSONP. Чтобы выполнить междоменный запрос JSONP, вы должны вернуть запрос, заключенный в функцию обратного вызова, сгенерированную jQuery. Если jQuery не получает ответ, заключенный в эту функцию, обратный вызов успеха никогда не будет запущен.

Изменять

 return returnVal;

to

 return "[callback]({status: [returnVal]})";
person nullability    schedule 14.01.2013
comment
Я обновил свой вопрос, даже после внесения вышеуказанных изменений, только его обратный вызов ошибки. - person Abbas; 15.01.2013