2010-09-05 77 views
1

我想产生的OData代理的服务:http://services.odata.org/Northwind/Northwind.svc/ $元我使用System.Data.Services.Design.EntityClassGenerator用于生成的OData代理EntityClassGenerator:不产生任何输出NorthwindDataService

当我实例化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(); 
        } 
       } 
      } 
     } 
+0

你怎么开的XmlReader这对于GenerateCode呼叫输入? – 2010-09-16 11:50:00

+0

以下是代码: – Venki 2010-09-19 09:56:29

+0

我已更新原始帖子中的源代码。从文本阅读器创建XmlTextReader。之前,我从GetResponseStream获取的流中创建XmlTextReader。 – Venki 2010-09-19 10:04:04

回答

2

我发现代码中的问题是这样做完全是OP问什么一个很好的起点。所以,即使OP不接受答案,我也会描述我为了让别人有用而做出的改变。

  • 删除了xml = reader.ReadToEnd();呼叫。我假设这是为了调试目的来查看来自Web请求的响应,但它具有“清空”响应的读取器对象的结果。这意味着读者对于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(); 
     } 
     } 
    } 
}