动态调用web服务

zdm0923 2006-11-02 02:36:23
我网上找了个动态动用的例子
using System;

using System.IO;

using System.Configuration;

using System.CodeDom;

using System.CodeDom.Compiler;

using System.Net;

using System.Web.Services;

using System.Web.Services.Description;

using Microsoft.CSharp;

using System.Collections;

using System.Reflection;



namespace WuYou.NetSignUp

{

/// <summary>

/// WebServiceHelper 的摘要说明。

/// </summary>

public class WebServiceHelper

{

private string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ; //命名空间

private Assembly assembly = null; //程序集;

private string classname = string.Empty; //类名称;

private Type t; //表示类型;

private object obj = null; //表示实例;

private Boolean isSuccess = false; //是否创建实例成功;





public WebServiceHelper(string Url,string classname)

{

if(classname == null || classname == string.Empty)

this.classname = GetWsClassName(Url);

else

this.classname = classname;



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);

stream.Close();



//生成客户端代理类代码

CodeCompileUnit ccu = new CodeCompileUnit();

ccu.Namespaces.Add(cn);

sdi.Import(cn ,ccu);

CSharpCodeProvider csc = new CSharpCodeProvider();

ICodeCompiler icc = csc.CreateCompiler();



//设定编译参数

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());

}



assembly = cr.CompiledAssembly;

}

catch (System.Exception ex)

{

throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));

}

}



private Boolean CreateInstance()

{

try

{

t = assembly.GetType(@namespace+"."+classname,true,true);

obj = Activator.CreateInstance(t);

isSuccess = true;

}

catch (System.Exception e)

{

throw new Exception(e.Message);

}

return isSuccess;

}



public object InvokeWebService(string methodanme,object[] parms)

{



if(!isSuccess)

{

CreateInstance();

}



try

{

System.Reflection.MethodInfo mi = t.GetMethod(methodanme);



return mi.Invoke(obj,parms);



}

catch (System.Exception ex)

{

throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));

}



}



private string GetWsClassName(string wsUrl)

{

string[] parts = wsUrl.Split('/') ;

string[] pps = parts[parts.Length-1].Split('.') ;



return pps[0] ;

}

}

}

然后调用本地的
string url = "http://localhost/DymaticText/Service1.asmx" ;
string[] args=new string[2];
args[0] ="strere";
args[1] = "China" ;
object result = Proxy.InvokeWebService(url ,"HelloWorld " ,args) ;
this.label3.Text = result.ToString() ;
就出现错误"未将对象引用设置到对象的实例"
用网上别人提供的例子就可以测试成功
这是为什么?
谁碰到过这个问题并且解决了的告诉我一下啊
...全文
319 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
scow 2006-11-02
  • 打赏
  • 举报
回复
我也写了一个,可以调用, 没发现问题, 如下:
const string DefaultUrl = "http://192.168.60.27/ServiceDS/Service.asmx?wsdl";
static Program instance = new Program();

static void Main(string[] args)
{
instance.InvokeMethod();
Console.ReadLine();
}

void InvokeMethod()
{
Assembly proxyAssembly = CreateWSProxy(DefaultUrl);
Type proxyType = proxyAssembly.GetType("WebServiceProxy.Service");
MethodInfo mi = proxyType.GetMethod("xxxMethod");
PropertyInfo pi = proxyType.GetProperty("Credentials");
object proxy = Activator.CreateInstance(proxyType);
pi.SetValue(proxy, CredentialCache.DefaultCredentials, new object[0]);
Console.WriteLine(mi.Invoke(proxy, new object[] { "xxx" }).ToString());
}

Assembly CreateWSProxy(string url)
{
if (String.IsNullOrEmpty(url))
return null;

ServiceDescription wsdl = GetWsdl(url);
CodeNamespace cns = new CodeNamespace("WebServiceProxy");
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(wsdl, null, null);
sdi.ProtocolName = "Soap";
sdi.Import(cns, null);

CSharpCodeProvider cp = new CSharpCodeProvider();
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
cp.GenerateCodeFromNamespace(cns, sw, null);
string src = sb.ToString();
sw.Close();
Console.WriteLine(src);

CompilerParameters cmp = new CompilerParameters();
cmp.ReferencedAssemblies.Add("System.dll");
cmp.ReferencedAssemblies.Add("System.Xml.dll");
cmp.ReferencedAssemblies.Add("System.Web.Services.dll");
cmp.GenerateExecutable = false;
cmp.GenerateInMemory = true;
cmp.IncludeDebugInformation = false;

CompilerResults cr = cp.CompileAssemblyFromSource(cmp, src);

if (cr.Errors.Count > 0)
throw new Exception(string.Format("Build failed: {0} errors",
cr.Errors.Count));
return cr.CompiledAssembly;
}

ServiceDescription GetWsdl(string url)
{
WebRequest wreq = WebRequest.Create(url);
wreq.Credentials = CredentialCache.DefaultCredentials;
WebResponse resp = wreq.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream, System.Text.Encoding.UTF8);
string desc = sr.ReadToEnd();
XmlTextReader xtr = new XmlTextReader(new StringReader(desc));

ServiceDescription wsdl = ServiceDescription.Read(xtr);
xtr.Close();
sr.Close();
stream.Close();
resp.Close();
return wsdl;
}
内容概要:本文针对质子交换膜燃料电池(PEMFC)在动态压力工况下的最大功率点跟踪(MPPT)问题,提出了一种压力工况协同调控下的自适应高阶滑模控制策略,并基于Simulink平台完成了系统建模与仿真实现。该策略融合高阶滑模控制的强鲁棒性与自适应机制的参数在线优化能力,有效克服了PEMFC系统固有的非线性、外部扰动及工况时变性等挑战,实现了对最大功率点的快速、精确与稳定跟踪。研究内容涵盖控制策略的理论设计、李雅普诺夫稳定性分析、自适应律构建以及在多种动态工况下的仿真实验验证,结果表明该方法相较于传统控制策略具有更快的动态响应速度、更小的稳态振荡以及更强的抗干扰能力,显著提升了PEMFC系统的能量转换效率与运行稳定性。; 适合人群:具备一定控制理论基础和Simulink仿真经验,从事新能源发电系统、燃料电池控制、电力电子变换或先进控制算法研究的研发人员及高校研究生。; 使用场景及目标:①应用于燃料电池发电系统的高性能最大功率点跟踪控制设计;②为解决强非线性、多扰动耦合的能源系统提供先进的自适应鲁棒控制方案;③通过Simulink仿真验证高阶滑模与自适应控制算法的有效性,服务于科研项目攻关或工程原型开发。; 阅读建议:建议读者结合Simulink模型同步学习,重点关注控制律设计原理、自适应机制实现方式及仿真结果对比分析部分,并可通过与传统滑模控制进行对比,深入理解该策略在鲁棒性与动态性能上的优越性。
下拉可见数据集可视化效果示意。 【数据集概况】 · 检测类别(中文):[滴落物(Drop)] · 训练集:2021 张 · 验证集:128 张 · 测试集:42 张 · 总计:2191 张 该数据集聚焦于工业生产环境中地面或设备表面出现的各类滴落物检测,通过多角度、多光照条件下的图像采集,全面覆盖了不同形态、颜色和材质的滴落物样本。数据集真实还原了车间地面、金属板、木质结构等复杂背景下的实际场景,为自动化巡检系统提供了高价值的视觉依据,有助于实现对潜在污染源或泄漏点的早期识别与预警。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 71 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.8949** mAP50-95 | 0.5139 Precision | 0.8991 Recall | 0.8527 train/box_loss | 0.8544 train/cls_loss | 0.4842 val/box_loss | 1.5612 val/cls_loss | 0.6862 【训练过程分析】 71 轮训练后 mAP50 为 0.8949,模型基本收敛但还有提升余地。Loss 曲线下降正常,后期趋于平缓。mAP50-95 为 0.5139,和 mAP50 差距 0.38,定位精度是主要短板。 【模型性能评估】 Precision 0.8991、Recall 0.8527,精度高于召回,存在一定漏检。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖滴落物,置信度整体偏高。 【改进建议】 1. 增强难例挖掘:在大规模数据中筛选误检...

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧