zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    ●BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
    ●BZOJ 1396 识别子串
    ●UVA 1608 Non-boring sequences
    ●SPOJ 8222 NSUBSTR–Substrings
    ●SPOJ 7258 Lexicographical Substring Search
    ●CodeForces 429D Trick_Function
    ●BZOJ 2555 SubString
    ●洛谷P2664 树上游戏
    ●洛谷P3168 [CQOI2015]任务查询系统
    【UVA1057】Routing
  • 原文地址:https://www.cnblogs.com/kongdf/p/7002496.html
Copyright © 2011-2022 走看看