1

我正在尝试为服务生成 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();
                    }
                }
            }
        }
4

1 回答 1

2

我发现问题中的代码是一个有用的起点,可以完全按照 OP 的要求进行操作。因此,即使 OP 不接受答案,我也会描述我为使其正常工作所做的更改,以防它对其他人有用。

  • 取消了xml = reader.ReadToEnd();通话。我认为这是出于调试目的来查看来自 Web 请求的响应,但结果是“清空”了响应的读取器对象。这意味着阅读器中没有任何内容可供GenerateCode调用。
  • 重要的一点: 改变了EntityClassGeneratorto的使用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();
         }
      }
   }
}
于 2011-04-04T20:21:14.627 回答