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];
}
}
}
这是我调的方法
看下通过url打开是不是正常的
用soap获取的XML是正确的 但是用这个方法执行的时候就报错there is an error in XML document(1,2)
@QZ123: 看下错在哪儿,具体是什么错误
@SeayXu: 这个错误怎么看?不知道怎么看 所以才纠结
@QZ123: 在catch中可以捕获到,ex.StackTrace
@SeayXu: 我上面那个报错就是捕获出来的
@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)
-----------------------------------------这是什么错
@QZ123: xml序列化出错了
@SeayXu: 那怎么改
@QZ123: 现在我也不知道具体是什么问题,不知如何改
刚刚测试了上面的代码,可以使用。
需要注意一些地方
1、传入的url,类似于 http://localhost:5000/Szwebservice1/service1.asmx的格式,并且在浏览器中访问url + "?WSDL"
有xml结果的就是可以用的。
2、namespace 你这里使用的测试不通过,随便改个(例如test),测试通过了
有问题再追问。
如果还是不错成功的话,我可以提供另外一种方式给你动态访问webservice
我的webservice地址类似于http://10.1.1.1/vmse/services/CuService?wsdl
我这种的wsdl有可以下载的类方法吗
@QZ123: webservice公开的路径应该是类似asmx结尾的文件。10.1.1.1是本地局域网IP,我访问不到。你自己再浏览器中测试有没有结果?
PS:我觉得你还是先别动态访问了,先通过引用访问再说吧
@hahanonym: 我就打个比方 但是我的路径结构就是合上面一样的
@QZ123: 首先我没见过这种形式访问的webservice,这种大概是类似webapi好像,通过webapi公开的接口,访问形式另说。
webservice有一个接口方法列表页,类似这种样式的。
@hahanonym: 我的就是公开的 里面全是XML方法 然后传参数就可以获取对应的返回值
@QZ123: 不知道你在说什么。对外公开接口的方式有很多, 请先确定下你的接口是怎么传数据的,get/post还是webservice或者其他,不同方式访问方法不同。
webservice输入url得到的是上面的那个图。url+?wsdl得到的是xml文档
@hahanonym: 加下QQ吧516293117 截图给你看
@hahanonym: