1

サービスの OData プロキシを生成しようとしています: http://services.odata.org/Northwind/Northwind.svc/ $metadata

OData プロキシの生成に System.Data.Services.Design.EntityClassGenerator を使用しています。

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は回答を受け入れませんが、他の誰かにとって役立つ場合に備えて、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();
         }
      }
   }
}
于 2011-04-04T20:21:14.627 に答える