Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Как вызвать web service?


Автор: Bogdan1024 2.10.2008, 17:34
Есть url сервиса и xml с параметрами, которые необходимо ему скормить. Как его вызвать не добавляя ссылку на сервис в проект?

Автор: Mymik 2.10.2008, 17:42
Код

Uri uri = new Uri("http://....");
WebRequest webRequest = WebRequest.Create(uri);
System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();

// Get a WSDL
ServiceDescription sd = ServiceDescription.Read(requestStream);
string sdName = sd.Services[0].Name;

// Initialize a service description servImport
ServiceDescriptionImporter servImport = new ServiceDescriptionImporter();
servImport.AddServiceDescription(sd, String.Empty, String.Empty);
servImport.ProtocolName = "Soap";
servImport.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

CodeNamespace nameSpace = new CodeNamespace();
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
codeCompileUnit.Namespaces.Add(nameSpace);

// Set Warnings

ServiceDescriptionImportWarnings warnings = servImport.Import(nameSpace, codeCompileUnit);

if (warnings == 0)
{
    StringWriter stringWriter = 
         new StringWriter(System.Globalization.CultureInfo.CurrentCulture);

    Microsoft.CSharp.CSharpCodeProvider prov = 
      new Microsoft.CSharp.CSharpCodeProvider();

    prov.GenerateCodeFromNamespace(nameSpace, 
       stringWriter, 
       new CodeGeneratorOptions());

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

    CompilerParameters param = new CompilerParameters(assemblyReferences);

    param.GenerateExecutable    = false;
    param.GenerateInMemory      = true;
    param.TreatWarningsAsErrors = false;

    param.WarningLevel = 4;

    CompilerResults results = new CompilerResults(new TempFileCollection());
    results = prov.CompileAssemblyFromDom(param, codeCompileUnit);
    Assembly assembly = results.CompiledAssembly;
    service = assembly.GetType(sdName);

    methodInfo = service.GetMethods();
}

Автор: Bogdan1024 2.10.2008, 17:54
А если нет WSDL?
В вбскрипте это выглядит так:
Код

Set xmlHTTP = CreateObject("Microsoft.XMLHTTP")
xmlHTTP.open "POST", URLPath, False
xmlHTTP.send(strxml) 'xml с параметрами
strXMLOut = xmlHTTP.responseText 'ответ

Как это на C# написать?

Автор: Bogdan1024 2.10.2008, 18:37
Нужно юзать какой-то XML-HTTP-POST protocol. Шо это и как мне не совсем понятно.

Автор: Bogdan1024 3.10.2008, 12:47
Сделал так:
Код

            Uri uri = new Uri(@"http://83.244.137.79/ServiceSearch.asp");            
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "text/xml";            
            System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Documents and Settings\bve\My Documents\Visual Studio 2005\Projects\ConsoleApplication1\ConsoleApplication1\XMLFile1.xml");
            string s = sr.ReadToEnd();
            sr.Close();
            System.Console.WriteLine("+Sending request.+");
            System.Console.WriteLine(s);
            System.IO.StreamWriter sw = new System.IO.StreamWriter(request.GetRequestStream());            
            sw.Write(s);                   
            sw.Close();
            System.Console.WriteLine("+Waiting for response.+");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            sr = new System.IO.StreamReader(response.GetResponseStream());
            System.Console.WriteLine(sr.ReadToEnd());
            sr.Close();
            System.Console.WriteLine("+End of response.+");
            System.Console.ReadKey(false);

Сервис возвращает ошибку "bad xml", хотя если этот же xml отправлять другим способом через тестовую страничку, то всё хорошо. Мне кажется проблема в кодировке. Как её указать можно?

Автор: Bogdan1024 6.10.2008, 10:37
Разобрался: сделал как в последнем посту, только я случайно не на тот сервис данные слал  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)