weixin_36061273 2023-10-12 13:27 采纳率: 0%
浏览 19

求助C#如何调用.cls 后缀web服务的方法

调用.cls 结尾的webService文件

  string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) || (classname == ""))
            {
                classname = GetWsClassName(url);
            }
            try
            {
                //获取WSDL   
                WebClient wc = new WebClient();
                Stream stream = null;
                try
                {
                    stream = wc.OpenRead(url+"?WSDL");
                }
                catch
                {
                    msg = "webService服务打开失败!请检查网络或者确认webService服务器是否可以连接!";
                    sc.AddLog.WriteLog(msg);
                }
                ServiceDescription sd = ServiceDescription.Read(stream); //报错点!!!!!!!!
                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                sdi.AddServiceDescription(sd, "", "");
                CodeNamespace cn = new CodeNamespace(@namespace);
                //生成客户端代理类代码   
                CodeCompileUnit ccu = new CodeCompileUnit();
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
                CSharpCodeProvider icc = new CSharpCodeProvider();
                //设定编译参数   
                CompilerParameters cplist = new CompilerParameters();
                cplist.GenerateExecutable = false;
                cplist.GenerateInMemory = true;
                cplist.ReferencedAssemblies.Add("System.dll");
                cplist.ReferencedAssemblies.Add("System.XML.dll");
                cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
                cplist.ReferencedAssemblies.Add("System.Data.dll");
                //编译代理类   
                CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                if (true == cr.Errors.HasErrors)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }
                    throw new Exception(sb.ToString());
                }
                //生成代理实例,并调用方法   
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type t = assembly.GetType(@namespace + "." + classname, true, true);
                #region
                CodeNamespace cn1 = new CodeNamespace(@namespace);
                CodeCompileUnit ccu1 = new CodeCompileUnit();
                Microsoft.CSharp.CSharpCodeProvider icc1 = new Microsoft.CSharp.CSharpCodeProvider();
                CompilerParameters cp = new CompilerParameters();
                CompilerResults cr1 = icc1.CompileAssemblyFromDom(cp, ccu);
                #endregion
                //Type t = cr1.CompiledAssembly.GetTypes()[0];
                object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi = t.GetMethod(methodname);
                if (mi == null)
                {
                    msg += "找不到终端确认的webService中的方法:" + methodname;
                    sc.AddLog.WriteLog("开始" + msg);
                }
                //释放
                if (stream != null)
                {
                    stream.Close();
                    stream.Dispose();
                }
                try
                {
                    re = mi.Invoke(obj, args).ToString();
                    sc.AddLog.WriteLog(re);
                }
                catch(Exception ex) {
                    sc.AddLog.WriteLog(msg);
                }
            }
            catch (Exception ex)
            {
                msg += ex.ToString();
                sc.AddLog.WriteLog(msg);
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
            sc.AddLog.WriteLog(re);
            return re;

//报错信息如下
System.InvalidOperationException: XML 文档(1, 2)中有错误。 ---> System.InvalidOperationException: 不应有 <html xmlns=''>。
   在 System.Web.Services.Description.ServiceDescriptionSerializationReader.Read125_definitions()
   在 System.Web.Services.Description.ServiceDescription.ServiceDescriptionSerializer.Deserialize(XmlSerializationReader reader)
   在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   在 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   在 System.Web.Services.Description.ServiceDescription.Read(XmlReader reader, Boolean validate)
   在 System.Web.Services.Description.ServiceDescription.Read(Stream stream, Boolean validate)
   在 System.Web.Services.Description.ServiceDescription.Read(Stream stream)

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-13 00:30
    关注

    【以下回答由 GPT 生成】

    在调用以 .cls 后缀的 Web 服务方法时,首先需要根据给定的 url 获取 Web 服务的 WSDL(Web Services Description Language)文件。然后,使用 ServiceDescription 类的 Read 方法读取 WSDL 文件并生成对应的服务描述对象。但在你的代码中,报错是因为无法正确读取 WSDL 文件。

    以下是解决问题的具体步骤:

    1. 确保你提供的 url 是正确的,可以通过浏览器访问到该 Web 服务的 WSDL 文件。
    2. 由于是读取网络资源,需要使用 WebClient 类来获取 WSDL 文件的内容,可以使用 OpenRead 方法打开链接并返回一个 Stream 对象。
    3. 注意捕获可能的异常,例如网络连接失败等,可以在 try-catch 块中处理错误并记录相关信息。
    4. 使用 ServiceDescription.Read(stream) 方法读取 stream 中的 WSDL 内容,生成一个 ServiceDescription 对象。这一步可能会报错,原因可能是网络连接问题、WSDL 文件不正确或无法解析等。
    5. 创建一个 ServiceDescriptionImporter 对象,并通过 AddServiceDescription 方法将获取到的 ServiceDescription 对象添加到 ServiceDescriptionImporter 中。
    6. 创建一个 CodeNamespace 对象,用于存放生成的客户端代理类的命名空间。
    7. 创建一个 CodeCompileUnit 对象,并将 CodeNamespace 对象添加到其中。这一步时为了生成客户端代理类的代码。
    8. 创建一个 CSharpCodeProvider 对象,用于编译代理类的源代码。
    9. 创建一个 CompilerParameters 对象,用于设定编译代理类的参数。
    10. 将所有需要引用的程序集添加到 cplist.ReferencedAssemblies 中,确保编译过程不会缺少任何依赖项。在你的代码中已经添加了一些常用的程序集。
    11. 调用 icc.CompileAssemblyFromDom(cplist, ccu) 方法编译代理类,并将结果存储在 CompilerResults 对象 cr 中。
    12. 检查 cr.Errors.HasErrors 属性,如果为 true,则编译出现错误。可以遍历 cr.Errors 集合,以获取详细的错误信息。

    注意:以上只是解决问题的思路和步骤,具体的代码实现可能会涉及到更多的细节和调试过程。如果你还遇到其他问题或需要更详细的代码示例,请告诉我具体错误信息,以便提供更准确的帮助。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 10月12日
  • 修改了问题 10月12日
  • 创建了问题 10月12日

悬赏问题

  • ¥15 大家vs坏了求解决方案
  • ¥50 如何给网页加一个必须阅读几秒后才可以点击确定的公告弹窗
  • ¥15 人脐静脉内皮细胞(HEUVC)重悬后自动聚团,怎么解决?
  • ¥30 faiss 的 IndexFlatL2 相似性搜索
  • ¥20 找人开发一套大数据算法系统!
  • ¥15 pycharm中cv2安装后可以用但是无法补全或跳转函数,搜索后使用以下方法无效1.重新安装包(更换版本也不行,如何解决?
  • ¥15 如何关闭Win11文件资源管理器的搜索栏的预选词
  • ¥15 odoo17非生产订单产品出库整个业务流程处理
  • ¥20 寻大数据算法的技术!
  • ¥15 悬赏 关于#c++#的问题