Как указать несколько ключей в атрибуте DataServiceKey для объекта контекста данных службы данных WCF - PullRequest
0 голосов
/ 22 апреля 2011


Я использую поставщика отражений для моей службы данных WCF, и у моего объекта контекста данных есть два ключевых члена, например, EmpId и DeptId.

Если я укажу [DataServiceKey("EmpId", "DeptId")], сервис не будет работать. Когда я пытаюсь получить доступ к коллекции с URL http://localhost:55389/DataService.svc/EmployeeData, я получаю следующую ошибку:

Страница XML не может быть отображена Невозможно просмотреть ввод XML, используя стиль XSL простынь. Пожалуйста, исправьте ошибку и затем нажмите кнопку Обновить или попробуйте снова позже. Следующие теги были не закрыто: кормить. Обработка ошибок ресурс «http://localhost:55389/DataService.svc/EmployeeData'.

С одним членом в DataServiceKey, он работает нормально. Я попытался с Custom Data Provider, и я смог добиться этой функциональности. Но если бы я мог сделать это с поставщиком Reflection, это было бы здорово.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Не думаю, что проблема в нескольких ключах.Для подтверждения используйте, например, Fiddler или что-то подобное, чтобы получить полный ответ от сервера и поделиться ошибкой в ​​нем (я уверен, что там будет один).Исходя из описания, я думаю, что проблема в том, что одно из значений вашего ключевого свойства равно нулю.Это не поддерживается и может вызвать так называемую ошибку в потоке, которая может привести к неполному ответному XML (что, по-видимому, относится к вашему случаю).

2 голосов
/ 05 декабря 2012

OData может обрабатывать несколько ключей, но все ключи должны иметь допустимое значение.Просмотрите this для правила OData.Если вы хотите получить запись с EmpId = 1 и DeptId = someString, вы должны преобразовать свой URI во что-то вроде:

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

Будьте осторожны в запросах OData, потому что они чувствительны к регистру.

1 голос
/ 22 апреля 2011

Это странно, я только что попробовал это:

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-

...