【问题标题】:How do I specify multiple keys in DataServiceKey attribute for WCF Data Service data context object如何在 WCF 数据服务数据上下文对象的 DataServiceKey 属性中指定多个键
【发布时间】:2011-08-10 16:25:49
【问题描述】:


我正在为我的 WCF 数据服务使用反射提供程序,并且我的数据上下文对象有两个关键成员,例如 EmpId 和 DeptId。

如果我指定[DataServiceKey("EmpId", "DeptId")],该服务将不起作用。当我尝试使用 URL http://localhost:55389/DataService.svc/EmployeeData 访问集合时,我收到以下错误:

无法显示 XML 页面 无法使用 XSL 样式查看 XML 输入 床单。请更正错误并 然后单击刷新按钮,或尝试 稍后再试。以下标签是 未关闭:饲料。错误处理 资源 'http://localhost:55389/DataService.svc/EmployeeData'。

使用 DataServiceKey 中的单个成员,它可以正常工作。我尝试使用自定义数据提供程序,并且可以实现此功能。但是,如果我可以使用反射提供者来做到这一点,那就太好了。

【问题讨论】:

    标签: odata wcf-data-services


    【解决方案1】:

    我认为问题不在于多个键。要确认,请使用例如 Fiddler 或类似的东西从服务器获取整个响应并共享其中的错误(因为我确信那里会有一个)。 从描述中猜测,我认为问题在于您的关键属性值之一为空。这不受支持,并且会导致所谓的流内错误,这会使响应 XML 不完整(这似乎是您的情况)。

    【讨论】:

    • 没错。我的测试数据中的一些记录有空的 DeptId,这导致了问题。否则它工作正常。谢谢@Vitek Karas MSFT。
    【解决方案2】:

    OData 可以处理多个键,但所有键都必须具有有效值。查看 this 了解 OData 的规则。如果您想检索 EmpId=1 和 DeptId=someString 的条目,您应该将您的 URI 重构为:

    http://localhost:55389/DataService.svc/EmployeeData(EmpId=1,DeptId='someString')

    在 OData 查询中要小心,因为它们区分大小写。

    【讨论】:

      【解决方案3】:

      这很奇怪,我刚试过这个:

      public class Context
      {
          public IQueryable<Person> People {
              get {
                  return (new List<Person> { 
                         new Person { EmpId = 1, DeptId = 2, Name = "Dude" }     
                  }).AsQueryable();
              }
          }
      }
      
      [DataServiceKey("EmpId", "DeptId")]
      public class Person
      {
          public int EmpId { get; set; }
          public int DeptId { get; set; }
          public string Name { get; set; }
      }
      
      public class WcfDataService1 : DataService<Context>
      {
          // This method is called only once to initialize service-wide policies.
          public static void InitializeService(DataServiceConfiguration config)
          {
              config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
              config.DataServiceBehavior.MaxProtocolVersion = 
                       DataServiceProtocolVersion.V2;
          }
      }
      

      而且它工作得很好,你注意到有什么主要的不同吗?

      -亚历克斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多