0

我的 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 方法,但随后我在服务器中得到了一个异常——这并不奇怪,因为我不知道请求的内容应该是什么样子.

我的问题:插入操作的 HTTP 请求内容的 (JSON) 格式是什么?

4

2 回答 2

0

插入给定示例的变更集如下所示:

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

于 2011-11-21T08:09:05.607 回答
0

这是一个很晚的答案,但以防万一其他人再次遇到这些问题;重要的__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,
});
于 2016-07-13T01:42:59.137 回答