【问题标题】:How to insert entity over WCF-RIA-Services JSON endpoint如何在 WCF-RIA-Services JSON 端点上插入实体
【发布时间】:2011-11-18 08:15:19
【问题描述】:

我的 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][namespace]WidgetService.svc/json/SubmitChanges。

我很确定我的 URL 是正确的,因为我的请求到达了 WidgetService.Initialize 方法,但随后我在服务器中得到了一个异常 - 这并不奇怪,因为我不知道请求的内容是什么应该是这样的。

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

【问题讨论】:

    标签: json rest wcf-ria-services domainservices


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这是一个很晚的答案,但以防其他人再次遇到这些问题; __type 是实体中的 first 键,这一点很重要。

      我遇到了以下异常: 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,
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 2011-04-25
        • 1970-01-01
        • 2011-09-01
        • 2011-08-24
        • 1970-01-01
        相关资源
        最近更新 更多