日期:2014-05-17 浏览次数:21030 次
WebServiceInvoker invoker;
invoker = new WebServiceInvoker(new Uri(webservice));
object[] args = new object[] {
(object)ecgId, (object)data, (object)sampleRate, (object)adBit, (object)adRange,
(object)uVpb, (object)amp, (object)seconds, (object)filter, (object)deviceSn,
(object)clientType, (object)alias, (object)patientName, (object)patientAge,(object)patientSex };
bool result = invoker.InvokeMethod<bool>("EcgWebService", "SaveEcgData", args);
[code=C#]
现在碰到一个奇怪的错误,我之前的一个程序调用这个webservice的SaveEcgData函数是正常的。现在手头的程序调用webservice的SaveEcgData函数时,抛出异常,提示找不到这个方法。而我用代理类中的public List<string> EnumerateServiceMethods(string serviceName)方法列举函数列表时列表里是肯定包含有SaveEcgData函数的。
碰到这个问题很奇怪,我很难解释原因,请问这个找不到方法,是因为什么原因?
代理类
[code=C#]
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Xml;
using System.Web.Services.Description;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.CodeDom;
namespace TestClient
{
class WebServiceInvoker
{
Dictionary<string, Type> availableTypes;
/// <summary>
/// Text description of the available services within this web service.
/// </summary>
public List<string> AvailableServices
{
get { return this.services; }
}
/// <summary>
/// Creates the service invoker using the specified web service.
/// </summary>
/// <param name="webServiceUri"></param>
public WebServiceInvoker(Uri webServiceUri)
{
this.services = new List<string>(); // available services
this.availableTypes = new Dictionary<string, Type>(); // available types
// create an assembly from the web service description
this.webServiceAssembly = BuildAssemblyFromWSDL(webServiceUri);
// see what service types are available
Type[] types = this.webServiceAssembly.GetExportedTypes();
// and save them
foreach (Type type in types)
{
services.Add(type.FullName);
availableTypes.Add(type.FullName, type);
}
}
/// <summary>
/// Gets a list of all methods available for the specified service.
/// </summary>
/// <param name="serviceName"></param>
/// <returns></returns>
public List<string> EnumerateServiceMethods(string serviceName)
{
List<string> methods = new List<string>();
if (!this.availableTypes.ContainsKey(serviceName))
throw new Exception("Service Not Available");
else
{
Type type = this.availableTypes[serviceName];
// only find methods of this object type (the one we generated)
// we don't want inherited members (this type inherited from SoapHttpClientProtocol)
foreach (MethodInfo minfo in type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly))
methods.Add(minfo.Name);
return methods;
}
}
/// <summary>
/// Invokes the specified method of the named service.
/// </summary>
/// <typeparam name="T">The expected return type.</typeparam>
/// <param name="serviceName">The name of the service to use.</param>