Как вставить сущность поверх конечной точки 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,
});