C# вызов навигационного веб-сервиса без добавления веб-ссылки

Я работаю над проектом, который требует от меня подключения к веб-службе Microsoft Dynamics NAV и получения некоторых данных. Однако у нас нет доступа к этому веб-сервису из среды разработки, поэтому я не могу добавить веб-ссылку в свой проект обычным способом.

Есть ли способ "динамически" подключаться к веб-ссылке во время выполнения, предоставляя URL, пользователя, пароль и домен? Затем создавать динамические объекты и вызывать методы веб-службы? (Так что я бы сделал консольное приложение, которое работает только в производственной среде, потому что есть доступ к веб-сервису)

Из моего первоначального исследования я нашел несколько способов, где есть функция, которая возвращает объекты типа объекта. У меня обычно возникают проблемы с учетными данными: Несанкционированный доступ (401)

Кстати, я очень новичок в этих веб-сервисах...

Метод, который я использовал до сих пор, без какой-либо удачи:

internal static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)

    {
        System.Net.WebClient client = new System.Net.WebClient();
        CredentialCache cc = new CredentialCache();
        cc.Add(
            new Uri(webServiceAsmxUrl),
            "NTLM",
            new NetworkCredential("user", "password", "domain"));
        client.Credentials = cc;
        // Connect To the web service
        System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl");

        // Now read the WSDL file describing a service.
        ServiceDescription description = ServiceDescription.Read(stream);
        ///// LOAD THE DOM /////////

        // Initialize a service description importer.

        ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

        importer.ProtocolName = "Soap12"; // Use SOAP 1.2.

        importer.AddServiceDescription(description, null, null);

        // Generate a proxy client.

        importer.Style = ServiceDescriptionImportStyle.Client;

        // Generate properties to represent primitive values.

        importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;

        // Initialize a Code-DOM tree into which we will import the service.

        CodeNamespace nmspace = new CodeNamespace();

        CodeCompileUnit unit1 = new CodeCompileUnit();

        unit1.Namespaces.Add(nmspace);

        // Import the service into the Code-DOM tree. This creates proxy code that uses the service.

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

        //THIS IS WHERE IT's NOT COMPLYING. warning will be "NoGeneratedCode"
        if (warning == 0) // If zero then we are good to go

        {

            // Generate the proxy code

            CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");

            // Compile the assembly proxy with the appropriate references

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

            CompilerParameters parms = new CompilerParameters(assemblyReferences);

            CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);

            // Check For Errors
            if (results.Errors.Count > 0)

            {

                foreach (CompilerError oops in results.Errors)

                {

                    System.Diagnostics.Debug.WriteLine("========Compiler error============");

                    System.Diagnostics.Debug.WriteLine(oops.ErrorText);

                }

                throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");

            }

            // Finally, Invoke the web service method

            object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);

            MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);

            return mi.Invoke(wsvcClass, args);

        }

        else

        {

            return null;

        }

    }

Всегда возвращает ноль.

2 ответа

Это веб-сервис (или) сервис WCF? Потому что если это служба WCF, то вы можете использовать SvcUtil.exe для доступа к услуге. Если это веб-сервис, то вы можете получить доступ к сервису из любого веб-браузера, если вы знаете имя файла WSDL, как показано ниже

http://servername/apppath/webservicename.asmx

(ИЛИ ЖЕ)

 http://servername/vdir/webservicename.asmx/Methodname?parameter=value

Смотрите эту документацию для получения дополнительной информации

Я знаю, что это старый пост, но я наткнулся на точно такой же вопрос. Я исправил это, изменив

importer.ProtocolName = "Soap12"; // Use SOAP 1.2.

в

importer.ProtocolName = "Soap"; // Woohoo

Допустимые значения для ProtocolName:

  • "Мыло"
  • "Soap12"
  • "HttpPost"
  • "HttpGet"
  • "HttpSoap"

согласно документации.

Надеюсь, что это помогает кому-то, кто сталкивается с подобной проблемой!

Другие вопросы по тегам