С# вызывает веб-службу навигации без добавления веб-ссылки

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

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

Из моего первоначального исследования я нашел несколько способов, где есть функция, которая возвращает объекты типа object. Обычно у меня возникают проблемы с учетными данными: Несанкционированный доступ (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;

        }

    }

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


person Laureant    schedule 18.12.2015    source источник


Ответы (2)


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

http://servername/apppath/webservicename.asmx

(OR)

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

Дополнительные сведения см. в этой документации.

person Rahul    schedule 18.12.2015
comment
Это веб-служба, потому что я могу получить доступ к файлу WSDL из Internet Explorer или из Web Service Studio. - person Laureant; 18.12.2015
comment
Проверьте это сообщение social.msdn.microsoft.com/Forums/vstudio/en-US/. похоже, вы находитесь в правильном направлении. - person Rahul; 18.12.2015
comment
Спасибо за ответ, но он не помогает, к сожалению. Код, который я добавил к вопросу, должен помочь, но переменная предупреждения имеет недопустимое значение. - person Laureant; 18.12.2015

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

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

to

importer.ProtocolName = "Soap"; // Woohoo

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

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

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

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

person Myshkin    schedule 14.11.2017