2015-09-29 1 views
1

Я определил несвязанную функцию с restier, которая возвращает список объекта poco. Он работает так, как ожидалось, но терпит неудачу во время возвращения объекта. Он не может сериализовать объект в json, когда он его возвращает. Сериализация по умолчанию не работает. Это ошибка, я получаю:Ошибка отбрасывания функции несанкционированного вызова во время возврата объекта

{ 
"error":{ 
"code":"","message":"An error has occurred.","innererror":{ 
    "message":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.","type":"System.InvalidOperationException","stacktrace":"","internalexception":{ 
    "message":"The related entity set could not be found from the OData path. The related entity set is required to serialize the payload.","type":"System.Runtime.Serialization.SerializationException","stacktrace":" at System.Web.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)\r\n at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)\r\n at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext()" 
     } 
    } 
    } 
} 

Мой код для определения типа возвращаемого и добавление OData метода в OnModelExtending выглядит следующим образом:

var ns = model.DeclaredNamespaces.First(); 

const string nmns = @"fully.qualified.namespace.to.the.poco.class"; 

var entityContainer = (EdmEntityContainer)model.EntityContainer; 

var xyzType = new EdmEntityType(nmns, "abc"); 

model.AddElement(xyzType); 

var xyz = (EdmEntityType)model.FindDeclaredType(nmns + "." + "abc"); 

var xyzs = EdmCoreModel.GetCollection(xyz.GetEdmTypeReference(isNullable: false)); 

var getxyzList = new EdmFunction(
    ns, 
    "GetxyzList ", 
    forms, 
    isBound: false, 
    entitySetPathExpression: null, 
    isComposable: true); 

getxyzList.AddParameter("Id", EdmCoreModel.Instance.GetInt32(true)); 

model.AddElement(getxyzList); 

entityContainer.AddFunctionImport("GetxyzList", getxyzList); 

Если я сериализации с Json.NET тогда я получаю строку json, которую я могу вернуть, но это не то, что я хочу. Я хочу, чтобы соответствующие форматированные json-данные одаты были такими же, как и для моделей odata. Как я могу получить это для этой функции? Возможно ли получить этот формат, если мой тип не является сущностью и просто обычным типом poco (который не сопоставляется ни с одной таблицей)? Любая помощь будет оценена.

ответ

0

Мы недавно обновили RESTier. Теперь он поддерживает построение функции из сигнатуры функции. Обратите внимание, что мы также отключили OnModelExtending, потому что это не согласованный стиль с новым процессом построения модели RESTier.

Вот адрес службы образца, где вы можете найти некоторые полезные образцы: https://github.com/OData/RESTier/blob/apidev/test/ODataEndToEndTests/Microsoft.Restier.WebApi.Test.Services.Trippin/Domain/TrippinDomain.cs

Вы можете скачать решение и попробовать с услугами образца. Подождите, пока наш следующий выпуск на NuGet понравится новым функциям.

Спасибо.

+0

Спасибо за хорошие новости. Я буду ждать этого. Любая догадка о том, когда она будет доступна, потому что у нас есть релиз, основанный на более ранней одате, которая появится в ноябре этого года. –

+0

@AnindaSen, вы можете ожидать следующего выпуска RESTier намного раньше ноября: P –