Here is the code snippet which will help to generate C# proxy classes from WSDL definition without using the WSDL.exe tool
public bool GenerateWsdlProxyClass(string fileName, string generatedSourceFilename,
string generatedNamespace)
{
// erase the source file
if (File.Exists(generatedSourceFilename))
File.Delete(generatedSourceFilename);
FileStream stream = File.Open(fileName, FileMode.Open);
ServiceDescription sd = null;
try
{
sd = ServiceDescription.Read(stream);
}
catch (Exception ex)
{
this.ErrorMessage = "Wsdl Download failed: " + ex.Message;
return false;
}
// create an importer and associate with the ServiceDescription
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "SOAP";
importer.CodeGenerationOptions = CodeGenerationOptions.None;
importer.AddServiceDescription(sd, null, null);
// Download and inject any imported schemas (ie. WCF generated WSDL)
foreach (XmlSchema wsdlSchema in sd.Types.Schemas)
{
// Loop through all detected imports in the main schema
foreach (XmlSchemaObject externalSchema in wsdlSchema.Includes)
{
// Read each external schema into a schema object and add to importer
if (externalSchema is XmlSchemaImport)
{
Uri baseUri = new Uri(fileName);
Uri schemaUri = new Uri(baseUri, ((XmlSchemaExternal)externalSchema).SchemaLocation);
Stream schemaStream = File.Open(schemaUri.AbsolutePath, FileMode.Open);
System.Xml.Schema.XmlSchema schema = XmlSchema.Read(schemaStream, null);
importer.Schemas.Add(schema);
}
}
}
// set up for code generation by creating a namespace and adding to importer
CodeNamespace ns = new CodeNamespace(generatedNamespace);
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(ns);
importer.Import(ns, ccu);
// final code generation in specified language
CSharpCodeProvider provider = new CSharpCodeProvider();
IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(generatedSourceFilename));
provider.GenerateCodeFromCompileUnit(ccu, tw, new CodeGeneratorOptions());
tw.Close();
stream.Close();
return File.Exists(generatedSourceFilename);
}
string generatedNamespace)
{
// erase the source file
if (File.Exists(generatedSourceFilename))
File.Delete(generatedSourceFilename);
FileStream stream = File.Open(fileName, FileMode.Open);
ServiceDescription sd = null;
try
{
sd = ServiceDescription.Read(stream);
}
catch (Exception ex)
{
this.ErrorMessage = "Wsdl Download failed: " + ex.Message;
return false;
}
// create an importer and associate with the ServiceDescription
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "SOAP";
importer.CodeGenerationOptions = CodeGenerationOptions.None;
importer.AddServiceDescription(sd, null, null);
// Download and inject any imported schemas (ie. WCF generated WSDL)
foreach (XmlSchema wsdlSchema in sd.Types.Schemas)
{
// Loop through all detected imports in the main schema
foreach (XmlSchemaObject externalSchema in wsdlSchema.Includes)
{
// Read each external schema into a schema object and add to importer
if (externalSchema is XmlSchemaImport)
{
Uri baseUri = new Uri(fileName);
Uri schemaUri = new Uri(baseUri, ((XmlSchemaExternal)externalSchema).SchemaLocation);
Stream schemaStream = File.Open(schemaUri.AbsolutePath, FileMode.Open);
System.Xml.Schema.XmlSchema schema = XmlSchema.Read(schemaStream, null);
importer.Schemas.Add(schema);
}
}
}
// set up for code generation by creating a namespace and adding to importer
CodeNamespace ns = new CodeNamespace(generatedNamespace);
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(ns);
importer.Import(ns, ccu);
// final code generation in specified language
CSharpCodeProvider provider = new CSharpCodeProvider();
IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(generatedSourceFilename));
provider.GenerateCodeFromCompileUnit(ccu, tw, new CodeGeneratorOptions());
tw.Close();
stream.Close();
return File.Exists(generatedSourceFilename);
}
No comments:
Post a Comment