JSON stringify для C # Webservice - PullRequest
       14

JSON stringify для C # Webservice

4 голосов
/ 28 февраля 2012

Я знаю, что есть несколько вопросов, но я попробовал многие из них, и я до сих пор не могу даже заставить свой сценарий сделать это на сервер. Вот что у меня сейчас есть:

Javascript

function UpdateSessionUser(user)
{
    if (user != null)
    {
        var targetPage = "http://" + document.location.host + "/Sitefinity/Services/Sandbox/SessionUsers.asmx/UpdateSessionUser";
        var dataText = { "jsonUser" : JSON.stringify(user) };

        try
        {

            $.ajax({
                type: "POST",
                url: targetPage,
                data: dataText,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response)
                {
                    alert(response.d);
                    return true;
                },
                failure: function (msg)
                {
                    alert(msg);
                    return false;
                }
            });
        }
        catch (err)
        {
            alert(err);
        }
    }
}

Пример пользовательского объекта

Object
BaseID: "fe85149c-71f2-4c61-b7c6-a00300e2f84e"
HasChanged: true
IsReferralReceived: false
IsReferralRequired: true
IsSeatApproved: true
Name: "Miles"
ReferralFromUser: null
ReferralFromUserID: null
ReferralReceivedBy: null
ReferralReceivedByUserID: null
ReferralReceivedOn: "/Date(-62135578800000)/"
RegisteredOn: "1330281960000"
SeatApprovedBy: null
SeatApprovedByUserID: null
SeatApprovedOn: "/Date(-62135578800000)/"
SeatNumber: "2"
SessionID: "d0773d5e-aeeb-4b9c-b606-0a564d6c5845"
UserID: "6af2fd9e-b4b6-4f5a-8e9c-fe7ec154d4e5"
__type: "SandboxClassRegistration.SessionUserField.ClientSessionUser"

C #

[WebMethod]
public bool UpdateSessionUser(object jsonUser)
{
    return SessionUserHelper.UpdateSessionUser(new ClientSessionUser(jsonUser));
}

Почему мой вызов JSON никогда не поступает на сервер? Я поставил точку останова в самом начале функции (перед возвратом), чтобы я мог посмотреть на параметр объекта jsonUser, но он там никогда не дойдет.

Все, что я получаю взамен, это ошибка:

POST http://localhost:60877/Sitefinity/Services/Sandbox/SessionUsers.asmx/UpdateSessionUser 500 (внутренняя ошибка сервера)

--- ОБНОВЛЕНИЕ

Вот окончательный результат (мне пришлось «зачеркнуть» объект, а затем окончательный отправляемый текст данных). Метод веб-сервиса не изменился

function CallWebServiceToUpdateSessionUser(target, user)
    {
        var dataText = { "jsonUser": JSON.stringify(user) };

        $.ajax({
            type: "POST",
            url: target,
            data: JSON.stringify(dataText),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response)
            {
                alert(response.d);
                return true;
            },
            failure: function (msg)
            {
                alert(msg);
                return false;
            }
        });
    }

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Не очень, насколько это поможет:

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

 var dataText = { "jsonUser" : JSON.stringify(user) };

на

  var dataText = JSON.stringify({ "jsonUser" : user });
0 голосов
/ 12 апреля 2013

Я понимаю, что на этот вопрос был дан ответ некоторое время назад, но у меня была похожая проблема, и я хотел бы предоставить некоторые подробности о том, почему решение OP работает

Я предполагаю, что веб-сервис ожидает строку, которую он будет десериализоватьи работать с

В этом случае вызов JSON.stringify({"jsonUser": user}) не преобразует user объект в строку, что приведет к проблемам на сервере.

Когда вы вызываете JSON.stringify({"jsonUser": JSON.stringify(user)}), ваш user oblect преобразуется в строку со всеми кавычками, правильно экранированными.

Надеюсь, это поможет кому-то в будущем.

Вот скрипка для иллюстрации http://jsfiddle.net/dvwCg/2/:

HTML

<h1>webservice breaks</h1>
<span id="s1"></span>
<h1>webservice works</h1>
<span id="s2"></span>

JS

var jsonObject = {"a":1, "b":[{"x":"test", "y":12}, {"x":"test2", "y":120}]};

$("#s1").text(JSON.stringify({"d" : jsonObject}));
$("#s2").text(JSON.stringify({"d" : JSON.stringify(jsonObject)}));

ps

https://stackoverflow.com/a/6323528/3661 также имеет много полезной информации.

0 голосов
/ 28 февраля 2012

Я думаю, вам нужно пометить метод обслуживания как включенный JASON.

[WebMethod] 
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)] 
public bool UpdateSessionUser(object jsonUser) 
{
     return SessionUserHelper.UpdateSessionUser(new ClientSessionUser(jsonUser));
} 
...