昨天也碰到这样一个问题,动态调用webservice,然后需要进行分页的方法,但是返回的是一个datatable对象。
动态调用的方法如下:
- C# code
-
publicstaticobject GetServiceFunction(string functionName, object[] args, params Type[] types) { object result =0; WebClient client =new WebClient(); Stream stream =null; String url = ConfigManager.GetConfigString("TransferReservateApp", "serviceUrl"); ;//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDLtry { stream = client.OpenRead(url); } catch (WebException webex)//若使ip地址改变导致的错误,读取本地文件 { } ServiceDescription description = ServiceDescription.Read(stream); ServiceDescriptionImporter importer =new ServiceDescriptionImporter();//创建客户端代理代理类。 importer.ProtocolName ="Soap"; //指定访问协议。 importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。 importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; importer.AddServiceDescription(description, null, null); //添加WSDL文档。 CodeNamespace nmspace =new CodeNamespace(); //命名空间 nmspace.Name ="PreService"; CodeCompileUnit unit =new CodeCompileUnit(); unit.Namespaces.Add(nmspace); ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters parameter =new CompilerParameters(); parameter.GenerateExecutable =false; parameter.OutputAssembly ="MyTest.dll";//输出程序集的名称 parameter.ReferencedAssemblies.Add("System.dll"); parameter.ReferencedAssemblies.Add("System.XML.dll"); parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); parameter.ReferencedAssemblies.Add("System.Data.dll"); CompilerResults compileResult = provider.CompileAssemblyFromDom(parameter, unit); if (compileResult.Errors.HasErrors) { // 显示编译错误信息 } Assembly asm = Assembly.LoadFrom("MyTest.dll");//加载前面生成的程序集 Type t = asm.GetType("PreService.Service1"); object o = Activator.CreateInstance(t); MethodInfo method; if (types.Length ==0)//如果没有out ,或者ref类型参数 { method = t.GetMethod(functionName); } else { method = t.GetMethod(functionName, types);// }
-
result = method.Invoke(o, args);
-
return result;
调试发现
- C# code
-
if (types.Length ==0)//如果没有out ,或者ref类型参数
-
{ method = t.GetMethod(functionName); }
-
else
-
{
-
method = t.GetMethod(functionName, types);//
-
}
-
result = method.Invoke(o, args);
result = method.Invoke(o, args);在红色标记处调试进去,整个底层方法的调用并没有问题。但是调式返回到红色标记后即爆“调用的目标发生了异常”。
.webservice中的方法如下
- C# code
-
[WebMethod]
-
public DataTable GetHospitalByPage(string where, int pageSize, int currentIndex, outint recordCount, outint pageCount)
-
{
-
HospitalBll hosBll =new HospitalBll();
-
return hosBll.GetPageList(pageSize, currentIndex, out recordCount, out pageCount, where);
-
}
我在csdn上也发过可是没人响应。
http://topic.csdn.net/u/20120207/09/767635b3-a1d3-4f53-b888-9fc8fe0d50e9.html?55247
我的问题和下面的情况类似,哪位帮忙看看。非常感谢!
http://topic.csdn.net/u/20100527/09/2eaa6369-ae2d-436c-aabc-ed62205ebf87.html?seed=300298756&r=77466691#r_77466691