EntityClassGenerator: не генерирует никакого вывода для NorthwindDataService - PullRequest
1 голос
/ 05 сентября 2010

Я пытаюсь сгенерировать прокси OData для службы: http://services.odata.org/Northwind/Northwind.svc/$metadata

Я использую System.Data.Services.Design.EntityClassGenerator для генерации прокси OData.

Когда я создаю экземпляр EntityClassGenerator и вызываю GenerateCode, вывод не содержит ошибок.Но в сгенерированном коде прокси нет кода.

Этот же код работает для моей службы.Но когда я указываю на какой-либо внешний сервис, EntityClassGenerator не работает.

Вот код:

        HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(metadataEndpoint);
        webRequest.Method = "GET";
        webRequest.ContentType = "text/xml;encoding='utf-8";
        webRequest.Proxy = (proxy != null) ? proxy : WebRequest.DefaultWebProxy;

        using (WebResponse response = webRequest.GetResponse())
        {
            string xml = string.Empty;
            XmlReaderSettings settings = new XmlReaderSettings();
            using (TextReader reader = new StreamReader(response.GetResponseStream()))
            {
                xml = reader.ReadToEnd();
                using (XmlTextReader sourceReader = new XmlTextReader(reader))
                {
                    using (StringWriter targetWriter = new StringWriter())
                    {
                        // Generate the OData End point proxy.
                        EntityClassGenerator entityGenerator = new EntityClassGenerator(LanguageOption.GenerateCSharpCode);
                        entityGenerator.OnPropertyGenerated += new EventHandler<PropertyGeneratedEventArgs>(entityGenerator_OnPropertyGenerated);

                        IList<System.Data.Metadata.Edm.EdmSchemaError> errors = entityGenerator.GenerateCode(sourceReader, targetWriter, namespacename);

                        entityGenerator.OnPropertyGenerated -= new EventHandler<PropertyGeneratedEventArgs>(entityGenerator_OnPropertyGenerated);
                        odataProxyCode = targetWriter.ToString();
                    }
                }
            }
        }

1 Ответ

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

Я нашел код в вопросе как полезную отправную точку для выполнения именно того, о чем спрашивал ОП.Поэтому, даже несмотря на то, что ОП не принимает ответы, я опишу изменения, которые я сделал, чтобы заставить его работать, в случае, если это будет полезно для кого-то еще.

  • Удален вызов xml = reader.ReadToEnd();.Я предполагаю, что это было в целях отладки, чтобы посмотреть на ответ от веб-запроса, но это привело к «опустошению» объекта чтения ответа.Это означало, что в ридере не осталось ничего для вызова GenerateCode.
  • Важный: Изменено использование EntityClassGenerator на System.Data.Services.Design.EntityClassGenerator.В приведенном ниже коде я включил все пространство имен для ясности и конкретности.Исходя из кода в вопросе, кажется, что OP, вероятно, использовал System.Data.Entity.Design.EntityClassGenerator.Я использовал .NET Reflector для проверки datasvcutil.exe, утилиты командной строки, которая может генерировать прокси-классы.Я увидел, что он ссылается на генератор в этом другом пространстве имен.
  • Для выяснения проблем я выкинул ошибки из вызова GenerateCode.Их можно проверить в отладчике, но независимо от этого потребуется некоторая автоматическая проверка.

Вот что я закончил:

HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.
      Create("http://services.odata.org/Northwind/Northwind.svc/$metadata");
webRequest.Method = "GET";
webRequest.ContentType = "text/xml;encoding='utf-8";
webRequest.Proxy = WebRequest.DefaultWebProxy;

using (WebResponse response = webRequest.GetResponse())
{
   using (TextReader reader = new StreamReader(response.GetResponseStream()))
   {
      using (XmlTextReader sourceReader = new XmlTextReader(reader))
      {
         using (StringWriter targetWriter = new StringWriter())
         {
            // Generate the OData End point proxy.
            System.Data.Services.Design.EntityClassGenerator entityGenerator = 
                new System.Data.Services.Design.EntityClassGenerator(
                   System.Data.Services.Design.LanguageOption.GenerateCSharpCode);

            IList<System.Data.Metadata.Edm.EdmSchemaError> errors =
                  entityGenerator.GenerateCode(sourceReader, targetWriter,
                                               "My.Model.Entities");

            foreach (System.Data.Metadata.Edm.EdmSchemaError error in errors)
               Console.WriteLine("{0}: {1}", error.Severity.ToString(), error.Message);

            string odataProxyCode = targetWriter.ToString();
         }
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...