How invocation of web services Without use add/Web reference.
We know the WSDL URL , Method name and Parameters we can access the Webservice without adding Proxy class & Web Reference.
Steps
- Read the WSDL Stream from the URL
Uri uri = new Uri(URL); WebRequest webRequest = WebRequest.Create(uri); Stream requestStream = webRequest.GetResponse().GetResponseStream();
- Read the Service name from the WSDL by using
ServiceDescription oServiceDescription = ServiceDescription.Read(requestStream); String sServiceName = oServiceDescription.Services[0].Name;
The ServiceDescriptionImporter class allows we to easily import the information contained in a WSDL description into a System.CodeDom.CodeCompileUnit object.
ServiceDescriptionImporter servImport = new ServiceDescriptionImporter(); servImport.AddServiceDescription(oServiceDescription, String.Empty, String.Empty); servImport.ProtocolName = "Soap"; servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties; CodeNamespace nameSpace = new CodeNamespace(); CodeCompileUnit codeCompileUnit = new CodeCompileUnit(); codeCompileUnit.Namespaces.Add(nameSpace);CodeCompileUnit contains a collection that can store CodeNamespace objects containing CodeDOM source code graphs, along with a collection of assemblies referenced by the project, and a collection of attributes for the project assembly.
- Now we can import the WSDL into CodeDom
ServiceDescriptionImportWarnings warnings = servImport.Import(nameSpace, codeCompileUnit);
- Then we Generate the code from CodeCompileUnit.Namespaces Class
StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.CurrentCulture); Microsoft.CSharp.CSharpCodeProvider prov = new Microsoft.CSharp.CSharpCodeProvider(); prov.GenerateCodeFromNamespace(nameSpace, stringWriter, new CodeGeneratorOptions());
- Compile the assembly with the appropriate references
String[] assemblyReferences = new String[2] { "System.Web.Services.dll", "System.Xml.dll" };
CompilerParameters param = new CompilerParameters(assemblyReferences);
param.GenerateExecutable = false;
param.GenerateInMemory = true;
param.TreatWarningsAsErrors = false;
param.WarningLevel = 4;
CompilerResults results = new CompilerResults(new TempFileCollection());
results = prov.CompileAssemblyFromDom(param, codeCompileUnit);
Assembly assembly = results.CompiledAssembly;
- Read all the methos & Parameters from the Compiled assembly ( Run time proxy instance).
methodInfo = service.GetMethods();
foreach (MethodInfo oInfo in methodInfo)
{
if (String.Compare(oInfo.Name, sMathod, true) == 0)
{
//Invoke Method
Object[] oParam = new Object[oInPutParam.Length];
for (int iCnt = 0; iCnt < oInPutParam.Length; iCnt++)
{
oParam[iCnt] = Convert.ChangeType(oInPutParam[iCnt], oInfo.GetParameters()[iCnt].ParameterType);
}
Object obj = Activator.CreateInstance(service);
response = oInfo.Invoke(obj, oParam);
break;
}
}
Complete Code Block
private String ServiceInvocation(String URL, String sMathod, Object[] oInPutParam)
{
MethodInfo[] methodInfo = null;
Type service = null;
Object response = null;
try
{
Uri uri = new Uri(URL);
WebRequest webRequest = WebRequest.Create(uri);
Stream requestStream = webRequest.GetResponse().GetResponseStream();
ServiceDescription oServiceDescription = ServiceDescription.Read(requestStream);
String sServiceName = oServiceDescription.Services[0].Name;
ServiceDescriptionImporter servImport = new ServiceDescriptionImporter();
servImport.AddServiceDescription(oServiceDescription, String.Empty, String.Empty);
servImport.ProtocolName = "Soap";
servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;
CodeNamespace nameSpace = new CodeNamespace();
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
codeCompileUnit.Namespaces.Add(nameSpace);
// Set Warnings
ServiceDescriptionImportWarnings warnings = servImport.Import(nameSpace, codeCompileUnit);
if (warnings == 0)
{
StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.CurrentCulture);
Microsoft.CSharp.CSharpCodeProvider prov = new Microsoft.CSharp.CSharpCodeProvider();
prov.GenerateCodeFromNamespace(nameSpace, stringWriter, new CodeGeneratorOptions());
// Compile the assembly with the appropriate references
String[] assemblyReferences = new string[2] { "System.Web.Services.dll", "System.Xml.dll" };
CompilerParameters param = new CompilerParameters(assemblyReferences);
param.GenerateExecutable = false;
param.GenerateInMemory = true;
param.TreatWarningsAsErrors = false;
param.WarningLevel = 4;
CompilerResults results = new CompilerResults(new TempFileCollection());
results = prov.CompileAssemblyFromDom(param, codeCompileUnit);
Assembly assembly = results.CompiledAssembly;
service = assembly.GetType(sServiceName);
methodInfo = service.GetMethods();
foreach (MethodInfo oInfo in methodInfo)
{
if (String.Compare(oInfo.Name, sMathod, true) == 0)
{
//Invoke Method
Object[] oParam = new Object[oInPutParam.Length];
for (int iCnt = 0; iCnt < oInPutParam.Length; iCnt++)
{
oParam[iCnt] = Convert.ChangeType(oInPutParam[iCnt], oInfo.GetParameters()[iCnt].ParameterType);
}
Object obj = Activator.CreateInstance(service);
response = oInfo.Invoke(obj, oParam);
break;
}
}
}
else
throw new Exception(warnings.ToString());
return Convert.ToString(response);
}
catch
{
throw;
}
}
Thank You
No comments:
Post a Comment