Calling the Web Service dynamically (.NET 动态访问Web Service)

针对.NET平台下的WebService访问,为达到不添加引用的情况下,动态调用外部服务。

主体方法:

    public class WebServiceHelper
    {
        //Calling the WebService dynamically
        public static T CallWebServiceDynamic<T>(string address, string serviceName, string serviceMethod, object[] args) {
            WebClient client = new WebClient();
            System.IO.Stream stream = client.OpenRead(address);
            ServiceDescription description = ServiceDescription.Read(stream);

            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
            importer.ProtocolName = "Soap12";
            importer.AddServiceDescription(description, null, null);
            importer.Style = ServiceDescriptionImportStyle.Client;
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

            CodeNamespace nmspace = new CodeNamespace();
            CodeCompileUnit compileUnit = new CodeCompileUnit();
            compileUnit.Namespaces.Add(nmspace);
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, compileUnit);
            if ( warning != 0 ) {
                throw new Exception($"Warning:{warning}");
            }

            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            string[] assemblyReferences = new string[3] {
                "System.dll",
                "System.Xml.dll",
                "System.Web.Services.dll"
            };
            CompilerParameters parms = new CompilerParameters(assemblyReferences);
            parms.GenerateExecutable = false;
            parms.GenerateInMemory = true;

            CompilerResults results = provider.CompileAssemblyFromDom(parms, compileUnit);
            object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);
            MethodInfo method = wsvcClass.GetType().GetMethod(serviceMethod);
            var data = method.Invoke(wsvcClass, args);
            if ( data != null ) {
                return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(data));
            }
            return default(T);
        }
    }
View Code

使用场景:

string endPointAddress = ConfigurationManager.AppSettings["xxxxxx"];

        public WorkPackageServiceModel[] GetMinimalWorkPackage(Guid projectItemId, string projectNumber) {
            return WebServiceHelper.CallWebServiceDynamic<WorkPackageServiceModel[]>(endPointAddress, "DataCenter", "GetMinimalWorkPackage", new object[] { projectItemId, projectNumber });
        }
View Code

That's all!

posted @ 2017-06-13 17:33  kiddy-star  阅读(220)  评论(0编辑  收藏  举报