Introduction
Generally when we use web service, at first we should add it in the web reference and then call its methods statically. Despite having a high speed, it isn't very flexible.
In order to do it dynamically by dynamic invocation of web service, it has a very good flexibility. For example, the source of programs will be compiled once.
We can use any web service that we need. We can watch all of the web service's methods and parameters, automatic assignment methods and parameters.
Generally programmers can do any work with this method. Like other methods, in this method to achieve the flexibility of parameters, the speed is lost. But spending time is more than getting benefits.
Using the Code
One of the communication ways with web service is setup. Giving the information about web service will be done through WSDL file. To do this work, we should produce a WebRequest
and send it to the WSDL. All activities about the parts are done by WebRequest
.
With calling GetRequest
method in Web request, WebRequest
will produce a stream
that will be sent to the read
method of service description object. Read
method returns a service description object that contains the information about web service in WSDL. We can call web service methods knowing the explanation of the web and using a proxy class.
The goal of producing a proxy class is making similar code that will be put in Reference.cs. When the user adds web reference in Visual Studio and compiles it, he/she can use it through assembly file in the applied program. The first step is making one instance of service Description importer and its goal is giving the ability to read the information from WSDL and add it to the codeDom.CodeCompilement
. After producing the service description importer, we call add service. Description method and send it to the service description object that contains information about the web service that we decide to call it. Now we have an assembly file whose methods and properties are from web service. All of the methods that are presented in proxy class are in the web method property in primary code. These class libraries have a method that returns an array of object from methodInfo
to the program, that we can choose some methods and fetch their parameters via using parameterInfo
class. For calling the web method, we need to produce an instance of proxy class that we give under type of web service information through Activator, createinstance
class.
In order to do this work, we should send the list of parameters to the Invoke
method which is expected.
private void DynamicInvocation()
{
Uri uri = new Uri(textBox1.Text);
WebRequest webRequest = WebRequest.Create(uri);
System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();
ServiceDescription sd = ServiceDescription.Read(requestStream);
string sdName = sd.Services[0].Name;
ServiceDescriptionImporter servImport = new ServiceDescriptionImporter();
servImport.AddServiceDescription(sd, String.Empty, String.Empty);
servImport.ProtocolName = "Soap";
servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;
CodeNamespace nameSpace = new CodeNamespace();
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
codeCompileUnit.Namespaces.Add(nameSpace);
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());
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(sdName);
methodInfo = service.GetMethods();
foreach (MethodInfo t in methodInfo)
{
if (t.Name == "Discover")
break;
treeWsdl.Nodes[0].Nodes.Add(t.Name);
}
treeWsdl.Nodes[0].Expand();
}
}
Wsdl Files
On the internet, you could find too many wsdl files of web services, for example:
Thanks
- to Faramaz Safi (my teacher) for guiding me with this