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

61
4

Я работаю над проектом, который требует от меня подключения к веб-службе 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 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;

}

}

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

спросил(а) 2021-01-19T17:59:02+03:00 2 месяца, 3 недели назад
1
Решение
105

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

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

в

importer.ProtocolName = "Soap"; // Woohoo

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

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

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

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

ответил(а) 2021-01-19T17:59:02+03:00 2 месяца, 3 недели назад
44

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

http://servername/apppath/webservicename.asmx

(ИЛИ)


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

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

ответил(а) 2021-01-19T17:59:02+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема