还是动态调用web service的问题

JollyFred 2002-09-18 12:58:50
我的想法是:从System.Web.Services.Protocols.SoapHttpClientProtocol继承了一个子类,通过动态设置它的url了,然后用invoke来调用具体的方法,将其作为一个通用的代理,实现对不同web service的动态调用。

原贴请见
http://www.csdn.net/expert/topic/1002/1002223.xml?temp=.8407862
我结贴后才发现原来问题,并没有解决,还希望大家再帮我看看,最好能给我简单的例子,谢谢!
...全文
41 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
superct 2002-09-24
  • 打赏
  • 举报
回复
呵呵,确实忘记了
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add("system.web.dll");
cp.ReferencedAssemblies.Add("system.web.services.dll");
cp.GenerateExecutable = false;//生成可执行体
cp.GenerateInMemory = true;//在内存中生成
JollyFred 2002-09-24
  • 打赏
  • 举报
回复
楼上的大哥,真是太感谢你了,我的问题基本搞定了。
只是你的代码中,少定义了个cp,我补充为
CompilerParameters cp=new CompilerParameters();
现在可以用了,代码如下
XmlTextReader reader = new XmlTextReader("Http://localhost/MathService/Service1.asmx?WSDL");
ServiceDescription sd = ServiceDescription.Read(reader);
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, null, null);

CodeNamespace cn = new CodeNamespace("CodeDom");
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);

ICodeCompiler icc = new CSharpCodeProvider().CreateCompiler();
CompilerParameters cp=new CompilerParameters();
CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);
Type t = cr.CompiledAssembly.GetType("CodeDom.Service1");
Object obj = Activator.CreateInstance(t);
MethodInfo mi = obj.GetType().GetMethod("Add");
Console.WriteLine(System.Convert.ToString(mi.Invoke(obj, new object[]{1,2})));

就ok了,给分!
谢谢各位大侠!
superct 2002-09-23
  • 打赏
  • 举报
回复
其实不用生成源码,直接用ICodeCompiler生成Assembly,然后生成这个Assembly的一个instance,然后执行你要调用的方法。
代码如下,接着你的代码:
ICodeCompiler icc = new CSharpCodeProvider().CreateCompiler();
CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);
Type t = cr.CompiledAssembly.GetType("YourServiceNamespaceName.YourServiceClassName");
Object obj = Activator.CreateInstance(t);
MethodInfo mi = obj.GetType().GetMethod("WebMethodName");
mi.Invoke(obj, Parameters);
试试吧。如果要做得更完善,应该把它包装成一个类,实现下列方法:
string[] GetOperations();
ParameterInfo[] GerParameters(string OperationName);
Type GetReturnType(string OperationName);
Object CreateInstance();
Object Invoke(string MethodName, paras object[] parameters);
...
JollyFred 2002-09-22
  • 打赏
  • 举报
回复
楼上的大哥,谢谢你的支持,我会去看看相关的资料的,又问题再来请教,谢谢!
JollyFred 2002-09-22
  • 打赏
  • 举报
回复
我看到一个例子,现在可以根据wsdl生成代理类了,但不知后面应该怎么做
(在内存中生成Proxy并编译,然后生成编译后的object的实例。通过obj.GetType().GetMethod(MethodName).Invoke来执行服务。)

ServiceDescription sd = ServiceDescription.Read("Math.WSDL");
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, null, null);

CodeNamespace cn = new CodeNamespace("CodeDom");
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);

ICodeGenerator cg =new CSharpCodeProvider().CreateGenerator();
CSharpCodeProvider cdp = new CSharpCodeProvider();
cg = cdp.CreateGenerator();
TextWriter tw = new StreamWriter("temp1.cs");
cg.GenerateCodeFromCompileUnit(ccu, tw, null);
tw.Close();

还请指教,谢谢!
JollyFred 2002-09-22
  • 打赏
  • 举报
回复
请问有相关的例子吗?
superct 2002-09-18
  • 打赏
  • 举报
回复
有两种方法,一是将利用System.Web.Services.Description中的类解析WSDL,用WSDK(ms的新的web service sdk,可在msdn上下)自己生成调用的SOAP包,发送到服务方。
二是利用System.Codedom结合System.Web.Services.Description的ServiceDescription类的Import方法,在内存中生成Proxy并编译,然后生成编译后的object的实例。通过obj.GetType().GetMethod(MethodName).Invoke来执行服务。

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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