Потребление операции обслуживания from.net клиент дайте мне ошибку


Если я использую свою служебную операцию из браузера, она работает отлично.

Если я использую свою служебную операцию из клиента .net, это дает мне ошибку

" система типов.Линк.IQueryable`1 [MyEntity] ' не имеет настраиваемых свойств."

Есть идеи? Спасибо.

Код клиента:

public IQueryable<MyEntity> CallMyOperation(string param1 = "", string param2 = "") {
        DataServiceQuery<IQueryable<MyEntity>> q =
            CreateQuery<IQueryable<MyEntity>>("MyOperation")
                .AddQueryOption("param1", "'" + param1 + "'")
                .AddQueryOption("param2", "'" + param2 + "'");
        return
            Execute<IQueryable<MyEntity>>(
                new Uri(q.RequestUri.ToString().Replace("MyOperation()", "MyOperation"))).
                FirstOrDefault();
    }

Служебный код Wcf:

        [WebGet]
    public IQueryable<MyEntity> MyOperation(string param1 = "", string param2 = "") {
     ...
    }

    public static void InitializeService(DataServiceConfiguration config) {
        config.DataServiceBehavior.MaxProtocolVersion =
            DataServiceProtocolVersion.V3;
        config.UseVerboseErrors = true;
        config.SetEntitySetAccessRule("MyEntity", EntitySetRights.AllRead);
        config.SetServiceOperationAccessRule("MyOperation", ServiceOperationRights.AllRead);
    }
1 2

1 ответ:

Вызов Execute<T> должен иметь только общий тип, который вы хотите материализовать, а не IQueryable<T>. Когда процесс материализации запускается, он пытается задать свойства для объекта из сущностей, которые он получил в WebResponse. Поскольку IQueryable<T> не обладает свойствами, которые вы получаете обратно на проводе, материализация терпит неудачу.

Если вы все еще хотите IQueryable, Вы можете позвонить Execute<MyEntity>(...).AsQueryable().