Имя: Пароль:
1C
1С v8
1С и WS на C#
0 san4o
 
07.03.12
08:54
Всех приветсвтую!

Есть простой веб-сервис на C#, у которого метод принимает строку(string) и пишет ее в базу. Пытаюсь этот веб-сервис вызвать из 1C - получаю ошибку:
{Форма.Форма.Форма(557)}: Ошибка при вызове метода контекста (TestMethod)
   ПроксиКласс.TestMethod(Сообщение);
по причине:
Несоответствие типов (параметр номер '1')


Код вызова следующий:
//определяем веб сервис по wsdl описанию    
ОпределениеВебСервиса = Новый WSОпределения("http://localhost:59820/EBECService.asmx?WSDL");
       
//Создание прокси для обращения в веб сервису
ПроксиКласс = Новый WSПрокси(ОпределениеВебСервиса,"http://tempuri.org/", "Service1", "Service1Soap");
Фабрика = ПроксиКласс.ФабрикаXDTO;
   
//СОздание объекта и вызов
Сообщение = Фабрика.Создать(Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "string"));
   
Сообщение="Привет из 1С!";
   
ПроксиКласс.TestMethod(Сообщение);
1 pessok
 
07.03.12
09:35
(0) вестимо TestMethod имеет первым параметром нечто отлично от строки
2 san4o
 
07.03.12
09:38
Код метода:

[WebMethod]
public void TestMethod(string input)
{
  dataManager.TestInsert(input);
}
3 pessok
 
07.03.12
09:49
а если закомментить
Сообщение = Фабрика.Создать(Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "string"));
?
4 pessok
 
07.03.12
09:51
В общем так
Сообщение = Фабрика.Создать(Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "string"));// создал объект

Сообщение="Привет из 1С!"; // уничтожил объект и создал константу строковую

Зачем? Затык именно в этом, хлебом не корми
5 sda553
 
07.03.12
09:56
(4) Верно, но при вызове метода TestMethod если этот метод действительно принимает параметр типа string "http://www.w3.org/2001/XMLSchema" то 1С его преобразует как надо.

Я сомневаюсь что метод TestMethod  принимает тип string
wsdl описание этого сервиса в студию!
6 san4o
 
07.03.12
10:05
Пробовал закомментить создание из фабрики - не помогает. WSDL в студию:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
 <wsdl:types>
   <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
     <s:element name="TestMethod">
       <s:complexType>
         <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="input" type="s:string" />
         </s:sequence>
       </s:complexType>

     </s:element>
     <s:element name="TestMethodResponse">
       <s:complexType />
     </s:element>
   </s:schema>
 </wsdl:types>
 <wsdl:message name="TestMethodSoapIn">
   <wsdl:part name="parameters" element="tns:TestMethod" />
 </wsdl:message>

 <wsdl:message name="TestMethodSoapOut">
   <wsdl:part name="parameters" element="tns:TestMethodResponse" />
 </wsdl:message>
 <wsdl:portType name="Service1Soap">
   <wsdl:operation name="TestMethod">
     <wsdl:input message="tns:TestMethodSoapIn" />
     <wsdl:output message="tns:TestMethodSoapOut" />
   </wsdl:operation>
 </wsdl:portType>

 <wsdl:binding name="Service1Soap" type="tns:Service1Soap">
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
   <wsdl:operation name="TestMethod">
     <soap:operation soapAction="http://tempuri.org/TestMethod" style="document" />
     <wsdl:input>
       <soap:body use="literal" />
     </wsdl:input>
     <wsdl:output>
       <soap:body use="literal" />

     </wsdl:output>
   </wsdl:operation>
 </wsdl:binding>
 <wsdl:binding name="Service1Soap12" type="tns:Service1Soap">
   <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
   <wsdl:operation name="TestMethod">
     <soap12:operation soapAction="http://tempuri.org/TestMethod" style="document" />
     <wsdl:input>
       <soap12:body use="literal" />

     </wsdl:input>
     <wsdl:output>
       <soap12:body use="literal" />
     </wsdl:output>
   </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="Service1">
   <wsdl:port name="Service1Soap" binding="tns:Service1Soap">
     <soap:address location="http://localhost:59820/EBECService.asmx" />

   </wsdl:port>
   <wsdl:port name="Service1Soap12" binding="tns:Service1Soap12">
     <soap12:address location="http://localhost:59820/EBECService.asmx" />
   </wsdl:port>
 </wsdl:service>
</wsdl:definitions>
7 sda553
 
07.03.12
11:20
Попробуй так:

//определяем веб сервис по wsdl описанию    

ОпределениеВебСервиса = Новый WSОпределения("http://localhost:59820/EBECService.asmx?WSDL");

       
//Создание прокси для обращения в веб сервису

ПроксиКласс = Новый WSПрокси(ОпределениеВебСервиса,"http://tempuri.org/", "Service1", "Service1Soap");

Фабрика = ПроксиКласс.ФабрикаXDTO;
   
//СОздание объекта и вызов

Сообщение = Фабрика.Создать(Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "TestMethod"));

   
Сообщение.Добавить("Привет из 1С!");
   
ПроксиКласс.TestMethod(Сообщение);
8 sda553
 
07.03.12
11:22
ой не то, ошибка в одной строчке

//определяем веб сервис по wsdl описанию    


ОпределениеВебСервиса = Новый WSОпределения("http://localhost:59820/EBECService.asmx?WSDL");


       
//Создание прокси для обращения в веб сервису


ПроксиКласс = Новый WSПрокси(ОпределениеВебСервиса,"http://tempuri.org/", "Service1", "Service1Soap");


Фабрика = ПроксиКласс.ФабрикаXDTO;
   
//СОздание объекта и вызов


Сообщение = Фабрика.Создать(Фабрика.Тип("http://tempuri.org/", "TestMethod"));


   
Сообщение.Добавить("Привет из 1С!");
   
ПроксиКласс.TestMethod(Сообщение);
9 san4o
 
07.03.12
11:53
Урра! Спасибо! Заработало, только вместо
Сообщение.Добавить("Привет из 1С!");
сделал:
Сообщение.input="Привет из 1С!";

Всем спасибо! Теперь вроде понял как оно работает:)