Неоднозначная ошибка соответствия при динамическом вызове перегруженных методов .asmx - PullRequest
0 голосов
/ 14 марта 2011

Я использую отражение и WSDL для вызова веб-сервисов на лету через динамически сконструированные прокси-классы, и я только что добавил некоторые перегруженные веб-методы в одну из веб-служб, которые я вызываю.Теперь я получаю сообщение об ошибке «Неоднозначное совпадение» при попытке вызвать (через отражение) метод.

Вот класс, который создает прокси службы и имеет метод для вызова любого данного веб-метода в этом прокси по имени:

public class ServiceProxy
{
    public ServiceMetadata Metadata { get; private set; }

    public RemoteServiceElement Element { get; private set; } 

    public string IpAddress { get; private set; } 

    private object serviceProxy;
    private string serviceAsmx;

    public ServiceProxy(RemoteServiceElement element)
    {
        IpAddress = element.IpAddress;
        Element = element; 

        serviceAsmx = "http://" + element.IpAddress + ":" + element.Port     + "xxxx.asmx"            
        Build(serviceAsmx, "xxxx"); 
    }

    public ServiceProxy(string ip, string _asmx, string _serviceName)
    {
        IpAddress = ip; 

        serviceAsmx = _asmx;
        Build(_asmx, _serviceName);
    }

    private void Build(string webServiceAsmx, string serviceName)
    {
        WebClient client = new WebClient();
        Metadata = ServiceMetadata.OpenWsdl(webServiceAsmx);

        Stream stream = client.OpenRead(webServiceAsmx + "?wsdl");
        ServiceDescription description = ServiceDescription.Read(stream);
        ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

        importer.ProtocolName = "Soap12";
        importer.AddServiceDescription(description, null, null);
        importer.Style = ServiceDescriptionImportStyle.Client;
        importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

        CodeNamespace nmspace = new CodeNamespace();
        CodeCompileUnit unit1 = new CodeCompileUnit();

        unit1.Namespaces.Add(nmspace);

        ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);

        if (warning == 0)
        {
            CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");

            string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll",
                "System.Xml.dll","System.Data.dll"  };

            CompilerParameters param = new CompilerParameters(assemblyReferences);
            CompilerResults results = provider1.CompileAssemblyFromDom(param, unit1);

            if (results.Errors.Count > 0)
            {
                foreach (CompilerError err in results.Errors)
                {
                    Logger.Write("Compiler error assembling " + webServiceAsmx + " - " + err.ErrorText);
                }
                throw new Exception("Compiler error occurred calling the web service. Check log for details.");
            }

            serviceProxy = results.CompiledAssembly.CreateInstance(serviceName);
            Logger.Write("Proxy service at + " + serviceAsmx + " assembled successfully"); 
        }

    }

    public object Invoke(string methodName, object[] args = null)
    {
        MethodInfo info = serviceProxy.GetType().GetMethod(methodName);

        object asmxResults = default(object);

        try
        {
            asmxResults = info.Invoke(serviceProxy, args);
            Logger.Write("Remote proxy at " + serviceAsmx + " - " + methodName + " - " + "invoked successfully"); 
        }
        catch (Exception e)
        {
            Logger.Write("Error invoking proxy class at " + serviceAsmx + " - " + e.InnerException);
        }

        return asmxResults;
    }
}

Это работало нормально, прежде чем я добавил какие-либо перегрузки.Поэтому я предполагаю, что использование отражения + перегрузки может вызвать проблему.

Вот пример макета одного из WebMethods, который вызывает проблему:

    [WebMethod (MessageName="GetFoos")]
    public List<Foo> GetFoos(DateTime dt)
    {
        // performs linq query
    }

    [WebMethod (MessageName = "GetFoosDynamic")]
    public List<Foo> GetFoos(Expression exp)
    {
        // linq query
    }

То же имя методаразные параметры + другое «MessageName», которое должно работать для веб-сервисов.

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 14 марта 2011

SOAP не поддерживает перегрузку методов, но похоже, что вы переопределили имя вашего метода с атрибутом WebMethod, поэтому вы должны вызывать имена, которые вы определили в этом атрибуте, когда вы делаете свой вызов SOAP.

...