我正在为我的WCF数据服务使用Reflection提供程序,我的数据上下文对象有两个关键成员,比如EmpId和DeptId。
如果我指定[DataServiceKey("EmpId", "DeptId")]
,则该服务不起作用。当我尝试使用URL http://localhost:55389/DataService.svc/EmployeeData
访问该集合时,出现以下错误:
无法显示XML页面 无法使用XSL样式查看XML输入 片。请更正错误 然后单击“刷新”按钮,或者尝试 稍后再试。以下标签是 未关闭:饲料。处理错误 资源 的 'http://本地主机:55389 / DataService.svc / EmployeeData工作'。
使用DataServiceKey中的单个成员,它可以正常工作。我尝试使用自定义数据提供程序,我可以实现此功能。但是,如果我可以使用Reflection提供程序,那就太棒了。
答案 0 :(得分:2)
我不认为问题是多个键。要确认请使用例如Fiddler或类似的东西从服务器获取整个响应并在其中共享错误(因为我确信会有一个在那里)。 从描述中猜测我认为问题是你的一个关键属性值是null。这是不受支持的,会引起所谓的插播错误,这会使响应XML不完整(这似乎是你的情况)。
答案 1 :(得分:2)
OData可以处理多个密钥,但所有密钥必须具有有效值。查看this的OData规则。如果要检索EmpId = 1和DeptId = someString的条目,则应将URI重建为:
http://localhost:55389/DataService.svc/EmployeeData(EmpId=1,DeptId='someString')
在OData查询中要小心,因为它们区分大小写。
答案 2 :(得分:1)
这很奇怪,我只是尝试过这个:
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;
}
}
它运作得很好,你注意到有什么重大差异吗?
-Alex