首页 新闻 赞助 找找看

C#动态调用wsdl下载里面的XML

0
悬赏园豆:40 [待解决问题]

C#动态调用wsdl下载里面的XML的时候报错there is an error in XML document(1,2)

问题补充:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Net;
using System.IO;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

namespace WBHelper
{
    public class WebServiceHelper
    {
        /// < summary>
        /// 动态调用web服务
        /// < /summary>
        /// < param name="url">WSDL服务地址< /param>
        /// < param name="methodname">方法名< /param>
        /// < param name="args">参数< /param>
        /// < returns>< /returns>
        public static object InvokeWebService(string url, string methodname, object[] args, out bool status)
        {
            return WebServiceHelper.InvokeWebService(url, null, methodname, args, out status);
        }
        /// < summary>
        /// 动态调用web服务
        /// < /summary>
        /// < param name="url">WSDL服务地址< /param>
        /// < param name="classname">类名< /param>
        /// < param name="methodname">方法名< /param>
        /// < param name="args">参数< /param>
        /// < returns>< /returns>
        public static object InvokeWebService(string url, string classname, string methodname, object[] args, out bool status)
        {
            status = false;

            string @namespace = "http://ws.vms.ivms6.hikvision.com";
            if ((classname == null) || (classname == ""))
            {
                classname = WebServiceHelper.GetWsClassName(url);
            }
            try
            { //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");
                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);
                object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi = t.GetMethod(methodname);
                status = true;
                return mi.Invoke(obj, args);
                // PropertyInfo propertyInfo = type.GetProperty(propertyname);
                //return propertyInfo.GetValue(obj, null);
            }
            catch (Exception ex)
            {
                //throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
                //using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\logs\\WebService", true))
                //{
                //    sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + ex.Message.ToString());
                //}
                //将错误信息返回
                status = false;
                return ex.Message.ToString();
            }
        }

        private static string GetWsClassName(string wsUrl)
        {
            string[] parts = wsUrl.Split('/');
            string[] pps = parts[parts.Length - 1].Split('.');
            return pps[0];
        }
    }
}
这是我调的方法

QZ123的主页 QZ123 | 初学一级 | 园豆:24
提问于:2016-06-03 11:27
< >
分享
所有回答(2)
0

看下通过url打开是不是正常的

CodeHsu | 园豆:5468 (大侠五级) | 2016-06-03 12:38

用soap获取的XML是正确的 但是用这个方法执行的时候就报错there is an error in XML document(1,2)

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 12:39

@QZ123: 看下错在哪儿,具体是什么错误

支持(0) 反对(0) CodeHsu | 园豆:5468 (大侠五级) | 2016-06-03 13:23

@SeayXu: 这个错误怎么看?不知道怎么看 所以才纠结

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 13:24

@QZ123: 在catch中可以捕获到,ex.StackTrace

支持(0) 反对(0) CodeHsu | 园豆:5468 (大侠五级) | 2016-06-03 13:27

@SeayXu: 我上面那个报错就是捕获出来的

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 13:34

@SeayXu: 
 at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Description.ServiceDescription.Read(XmlReader reader, Boolean validate)
   at WBHelper.WebServiceHelper.InvokeWebService(String url, String classname, String methodname, Object[] args, Boolean& status)
-----------------------------------------这是什么错

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 16:58

@QZ123: xml序列化出错了

支持(0) 反对(0) CodeHsu | 园豆:5468 (大侠五级) | 2016-06-03 17:23

@SeayXu: 那怎么改

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 17:23

@QZ123: 现在我也不知道具体是什么问题,不知如何改

支持(0) 反对(0) CodeHsu | 园豆:5468 (大侠五级) | 2016-06-03 19:14
0

刚刚测试了上面的代码,可以使用。

需要注意一些地方

1、传入的url,类似于 http://localhost:5000/Szwebservice1/service1.asmx的格式,并且在浏览器中访问url + "?WSDL"

     有xml结果的就是可以用的。

2、namespace 你这里使用的测试不通过,随便改个(例如test),测试通过了

有问题再追问。

如果还是不错成功的话,我可以提供另外一种方式给你动态访问webservice

hahanonym | 园豆:1460 (小虾三级) | 2016-06-03 19:09

我的webservice地址类似于http://10.1.1.1/vmse/services/CuService?wsdl

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 19:18

我这种的wsdl有可以下载的类方法吗

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 19:20

@QZ123: webservice公开的路径应该是类似asmx结尾的文件。10.1.1.1是本地局域网IP,我访问不到。你自己再浏览器中测试有没有结果?

PS:我觉得你还是先别动态访问了,先通过引用访问再说吧

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2016-06-03 19:45

@hahanonym: 我就打个比方 但是我的路径结构就是合上面一样的

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 19:47

@QZ123: 首先我没见过这种形式访问的webservice,这种大概是类似webapi好像,通过webapi公开的接口,访问形式另说。

webservice有一个接口方法列表页,类似这种样式的。

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2016-06-03 19:52

@hahanonym: 我的就是公开的 里面全是XML方法 然后传参数就可以获取对应的返回值

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 19:54

@QZ123: 不知道你在说什么。对外公开接口的方式有很多, 请先确定下你的接口是怎么传数据的,get/post还是webservice或者其他,不同方式访问方法不同。

webservice输入url得到的是上面的那个图。url+?wsdl得到的是xml文档

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2016-06-03 19:58

@hahanonym: 加下QQ吧516293117 截图给你看

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 20:05

@hahanonym: 

支持(0) 反对(0) QZ123 | 园豆:24 (初学一级) | 2016-06-03 20:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册