2016-04-21 4 views
1

Есть ли способ программно генерировать ответ метаданных/$, возвращаемый с маршрута контроллера ASP.Net Web Api OData таким образом, который может быть сериализован в XML?Программно сгенерировать Asp Net Web Api OData Route Metadata

Поэтому я хочу, чтобы сделать это, что я использую ветер, чтобы получить доступ к Web API с помощью адаптера OData и хотел бы предварительно загрузить Breeze MetadataStore с метаданными, как в этом http://breeze.github.io/doc-js/metadata-load-from-script.htmlexample.

Но этот пример не работает с адаптером OData, поскольку он использует разные метаданные.

ответ

0

Правда, метаданные OData обрабатываются Breeze корректно только при чтении ответа OData; MetadataStore не импортирует и не экспортирует его напрямую.

Я думаю, что самый простой способ справиться с этим, чтобы создать отдельный бит кода на стороне клиента, который будет

  1. Создать учетную EntityManager, который
  2. извлечение метаданных с сервера OData
  3. Экспорт метаданные из MetadataStore
  4. Вход метаданные, так что вы можете захватить его и хранить его в файле

Не элегантный, но он выполняет свою работу.

В будущей версии breeze.server.net будет выполняться преобразование метаданных OData-to-Breeze на сервере, поэтому у нас не будет этой проблемы.

2

Если я понимаю ваш вопрос, вы пытаетесь моделировать GET /$metadata на сервере, чтобы сохранить результаты в файле. В OData ASP.NET $metadata представлен объектом, который реализует IEdmModel (например, результат вызова ODataModelBuilder.GetEdmModel). Затем возникает вопрос о том, как сериализовать эту модель для XML.

Следующий помощник будет записывать метаданные службы в данный поток. Для параметров model и config вы должны передать те же объекты, которые использовались для вашей конфигурации сервиса.

public class MetadataHelper 
{ 
    public static Task WriteMetadataAsync(Stream stream, IEdmModel model, HttpConfiguration config, string odataRouteName) 
    { 
     var request = new HttpRequestMessage(HttpMethod.Get, "/$metadata"); 

     request.ODataProperties().Model = model; 
     request.ODataProperties().RouteName = odataRouteName; 
     request.SetConfiguration(config); 

     var payloadKinds = new List<ODataPayloadKind> { ODataPayloadKind.MetadataDocument }; 
     var xmlMediaType = new MediaTypeHeaderValue("application/xml"); 
     var formatter = new ODataMediaTypeFormatter(payloadKinds).GetPerRequestFormatterInstance(model.GetType(), request, xmlMediaType); 
     var content = new StringContent(String.Empty); 

     content.Headers.ContentType = xmlMediaType; 

     return formatter.WriteToStreamAsync(model.GetType(), model, stream, content, null); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^