Вызов Json (jquery) в службу отдыха WCF всегда запускает функцию ошибки - PullRequest
2 голосов
/ 01 декабря 2011

Я пытаюсь вызвать свою веб-службу (WCF Restful) из другого домена (в следующем коде они оба находятся в localhost, но с другим номером порта, который я предполагаю рассматривать как междоменный запрос), используя приведенный ниже JavaScript.

jQuery.support.cors = true;
$(document).ready(function () {
    {
        $.ajax({
            type: "POST",
            url: "http://localhost:52032/Service1.svc/std",
            contentType: "application/jsonp; charset=utf-8",
            dataType: "jsonp",

            processData: false ,    //Same result if i remove this line
            crossDomain : true  , //Same result if i remove this line
            converters: window.String, //Same result if i remove this line
            success: OnSuccess,
            error: OnError});
    }
});

function OnSuccess(data)
{
    alert("Finaly :D");
    JSON.stringify(data);
}

function OnError(request, status, error)
{
    alert("Error: "+request.statusText + JSON.stringify(request)+  " | " +JSON.stringify(status) +" | " +JSON.stringify(error));
}

Мой веб-сервис довольно прост. getStudents() возвращает строку JSON. Я использовал JavaScriptSerializer для анализа моего студенческого объекта в JSON.

namespace MyFirstWcfTestService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract(Name = "AddParameter")]
        [WebGet(UriTemplate = "/std", ResponseFormat = WebMessageFormat.Json)]
        String getStudents();

    }  
}

Я всегда получаю следующую ошибку из функции OnError, и когда я смотрю на ответ в режиме разработки / отладки Chrome, я вижу свой текст JSON.

Ошибка: Успех { "readyState": 4, "статус": 200, "его статус": "успех"} | "ParserError" | «jQuery1706816276672761887_1322704382563 не был вызван»

Мой возвращенный текст в формате json выглядит следующим образом:

"[{\" StudentID \ ": 256, \" StudentFirstName \ ": \" Али \ "\ "StudentSurname \": \ "Смит \"}, {\ "StudentID \": 306, \" StudentFirstName \ ": \" Джон \», \ "StudentSurname \": \ "Menz \"}, {\ "StudentID \": 314, \ "StudentFirstName \": \ "Джордж \", \ "StudentSurname \": \ "Луч \"}, {\ "StudentID \": 316, \ "StudentFirstName \": \ "Фред \", \ "StudentSurname \": \ "Patric \"}, {\ "StudentID \": 603, \ "StudentFirstName \": \ "Джордж \", \ "StudentSurname \": \ "Foster \"}, {\ "StudentID \": 604, \ "StudentFirstName \": \ "Bobbie \", \ "StudentSurname \ ": \" Колман \ "}, {\" StudentID \ ": 765, \" StudentFirstName \ ": \" Джим \», \ "StudentSurname \": \ "Хас \"}, {\ "StudentID \": 987, \ "StudentFirstName \": \ "Гарри \", \ "StudentSurname \": \ "потер \"}, {\ "StudentID \": 988, \ "StudentFirstName \": \ "Con \", \» StudentSurname \ ": \" Mench \ "}, {\" StudentID \ ": 1001 \" StudentFirstName \ ": \" Джим \ "\ "StudentSurname \": \ "Colon \"}]"

Не могли бы вы помочь мне найти решение этой проблемы. Я уже изменил свой веб-сервис с SOAP на этот спокойный.

EDIT Мне удалось обернуть мое сообщение jsonp в метод (myCallback следующим образом

myCallback ([{ "StudentID": 256, "StudentFirstName": "Рэйчел", "StudentSurname": "Смит"}, { "StudentID": 306, "StudentFirstName": "Али", "StudentSurname":» Флемминг "}, {" StudentID ": 314," StudentFirstName ":" Джордж», "StudentSurname": "Луч"}, { "StudentID": 316, "StudentFirstName": "Фред", "StudentSurname": "Патрик" }, { "StudentID": 603, "StudentFirstName": "Джордж", "StudentSurname": "Фостер"}, { "StudentID": 604, "StudentFirstName": "Бобби", "StudentSurname": "Колман"}, { "StudentID": 765, "StudentFirstName": "Джим", "StudentSurname": "Хас"}, { "StudentID": 987, "StudentFirstName": "Гарри", "StudentSurname": "Потер"}, {» StudentID ": 988," StudentFirstName ":" Con», "StudentSurname": "Mench"}, { "StudentID": 1001, "StudentFirstName": "Джим", "StudentSurname": "двоеточие"}]);

И я также меняю свой Ajax-вызов следующим образом

$.ajax({
                        type: "post",
                        url: "http://localhost:52032/Service1.svc/getStd?callback=myCallback",  //or callback=?
                        dataType: "jsonp",
                        //converters: jQuery.parseJSON,
                        contentType: 'application/javascript',
                        success: OnSuccess,
                        error: OnError

                    });

Но я все еще получаю ту же ошибку. Я за 3 недели мучаюсь за такую ​​простую задачу :(

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Попробуйте это изменить:

namespace MyFirstWcfTestService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract(Name = "AddParameter")]
        [WebGet(UriTemplate = "/std", ResponseFormat = WebMessageFormat.Json)]
        List<StudentDTO>getStudents();

    }  

    class StudentDTO
    {
       public int StudentID;
       public string StudentFirstName;
       public string StudentSurname;
    }
}

На стороне клиента:

function OnSuccess(data)
{
    for(var i=0;i<data.length;i++)
    {
        var fn = data[i].StudentFirstName;
        var sn = data[i].StudentSurName;
        ...
    }
}
0 голосов
/ 01 декабря 2011

Попробуйте изменить getStudents (), чтобы он возвращал Json (List, JsonRequestBehavior.AllowGet), и обращайтесь к возвращенному списку через jQuery, каждый из которых использует data [iterator] .StudentID, data [iterator] .StudentFirstName и т. Д.

...