2010-09-05 60 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(); 
     } 
     } 
    } 
}