开发者

EntityClassGenerator : Not generating any output for NorthwindDataService

开发者 https://www.devze.com 2023-01-14 17:29 出处:网络
I am trying to generate the OData Proxy for the service : http://services.odata.org/Northwind/Northwind.svc/$metadata

I am trying to generate the OData Proxy for the service : http://services.odata.org/Northwind/Northwind.svc/$metadata

I am using System.Data.Services.Design.EntityClassGenerator for generating the OData proxy.

When I instantiate the EntityClassGenerator and call GenerateCode the output has no errors. But there is no code in the generated proxy code.

The same code works for my own service. But when I point it to any external service the EntityClassGenerator is not working.

Here is the code :

        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.
                        EntityClass开发者_StackOverflow中文版Generator 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();
                    }
                }
            }
        }


I found the code in the question to be a useful starting point for doing exactly what the OP was asking. So even though the OP doesn't accept answers, I'll describe the changes I made to get it to work in case it is useful to someone else.

  • Removed the xml = reader.ReadToEnd(); call. I assume that was for debugging purposes to look at the response from the web request, but it had the result of "emptying" the reader object of the response. That meant that there was nothing left in the reader for the GenerateCode call.
  • The important one: Changed the use of EntityClassGenerator to System.Data.Services.Design.EntityClassGenerator. In the code below, I included the entire name space for clarity and specificity. Based on the code in the question, it appears the OP was probably using System.Data.Entity.Design.EntityClassGenerator. I used .NET Reflector to examine datasvcutil.exe, which is a command-line utility that can generate the proxy classes. I saw that it referenced the generator in that other name space.
  • For figuring out the problems, I dumped the errors from the GenerateCode call. One could examine them in the debugger, but some kind of automated checking of them would be needed regardless.

Here is what I ended up with:

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();
         }
      }
   }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消