Как вставить сущность поверх конечной точки JSON WCF-RIA-Services - PullRequest
0 голосов
/ 18 ноября 2011

Мой 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 ]

0 голосов
/ 13 июля 2016

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

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

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

Я хотел бы отметить, что это поведение противоречит спецификации JSON (см .: https://stackoverflow.com/a/5525820/1395343).

Один из возможных обходных путей - использовать 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,
});
0 голосов
/ 21 ноября 2011

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

{"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

...