Как вставить сущность поверх конечной точки JSON WCF-RIA-Services

Мой WCF-RIA DomainService имеет метод вставки, который выглядит следующим образом:

public void InsertWidget(WidgetDef widgetDef)

class WidgetDef
{
    [Key]
    int widgetID;
    string title;
    int x;
    int x;
    // there are more properties, but I think you get the idea...
}

Чтобы получить доступ к этому через конечную точку JSON, я думаю, что мне нужно ПОСТАВИТЬ набор изменений в URL:

[ServerURL][пространства имен]WidgetService.svc/ JSON /SubmitChanges.

Я почти уверен, что получил правильный URL, потому что мой запрос достигает метода WidgetService.Initialize, но затем я получаю исключение на сервере - что неудивительно, потому что я не знаю, как должно выглядеть содержимое запроса,

Мой вопрос: Каков формат (JSON) содержимого HTTP-запроса для операции вставки?

2 ответа

Решение

Вставьте набор изменений для приведенного примера:

{"changeSet":[ 
        {"Id":0, 
         "Entity":{"__type":"WidgetDef:#widgetDefNamespace",
                    "widgetId":0, 
                    "title":"the new title", 
                    "x":10, 
                    "y":10, 
                }, 
            "Operation":2    // '2' for insert, '3' for update, '4' for delete 
        } 
    ] 
} 

Благодаря следующему сообщению в блоге: http://www.joseph-connolly.com/blog/post/WCF-RIA-Services-jQuery-and-JSON-endpoint-Part-2.aspx

Это очень поздний ответ, но на тот случай, если кто-то еще столкнется с этими проблемами снова; важно, чтобы __type это первый ключ в сущности.

Я столкнулся с исключениями, такими как: This DomainService does not support operation 'Update' for entity 'Object'которые указывают, что доменная служба не смогла определить тип объекта, и поэтому не смогла найти соответствующий обработчик.

Исследование подняло этот пост на тему http://www.blog.yumasoft.com/node/108 которой содержится решение.

Я хотел бы отметить, что это поведение противоречит спецификации JSON (см.: /questions/42043495/garantiruet-li-javascript-poryadok-svojstv-obekta/42043501#42043501).

Одним из возможных решений является использование replace чтобы убедиться, что __type заканчивается в правильном месте. Я не уверен, что это хорошая идея, но она работает.

var entityChange = {};
entityChange.Id = 0;
entityChange.Operation = 3;
entityChange.Entity = {'key': 'Something that changed'};

var payload = JSON.stringify({ changeSet: [entityChange]});

// This is not an ideal way of doing this.
payload = payload.replace('"Entity":{', '"Entity":{"__type":"TypeName:#Namespace.Stuff",');
return $.ajax({
    url: "...Web.svc/JSON/SubmitChanges",
    method: "POST",
    data: payload,
    contentType: "application/json",
    dataType: "json",
    processData: false,
});
Другие вопросы по тегам