Интеграция 1С и веб-сервиса на WCF

1. k9260130000 27 10.07.20 11:27 Сейчас в теме
Добрый день !
Имеется веб-сервис на WCF. В настоящий момент его могут использовать написанные на C# программы. Хочу научить 1С вызывать функции на стороне этого веб-сервиса. Для авторизации используются сертификат и логин с паролем. Не подскажете как бы мне провернуть такое ?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
15. k9260130000 27 24.07.20 19:47 Сейчас в теме +1 $m
В конце концов выяснил что сервисы WCF могут быть вызваны сторонними решениями только через привязку basicHttpBinding. Т.е. в моём случае или прокси WCF-сервис. Или дополнительную привязку к основному.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. oleg-x 26 10.07.20 12:18 Сейчас в теме
(1) Ну не важно на чем его вызывали, можно реализовать и на 1С.
Что бы провернуть такое, надо получить документацию по подключению к веб сервису.
И уже методами 1С подключаться.
Скорее всего метод будет такой
HTTPСоединение = Новый HTTPСоединение("Адрес",,Пользователь,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL());
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Только еще сертификат надо добавить. Но без документации как работает сервис, ничего не получится (методы, способ авторизации).
3. k9260130000 27 10.07.20 12:51 Сейчас в теме
(2)
учить документацию по подключению к веб сервису.
И уже методами 1С подключаться.
Скорее всего метод будет такой

Сервис сам писал на C#. Хочу обращаться к нему со стороны 1С. Вот его AppConfig.

<services>
<service name="AssistantServer.AssistantWCF" behaviorConfiguration="mexBehavior">
<endpoint address="AssistantServer.AssistantServer" binding="wsHttpBinding" contract="AssistantServer.IAssistantWCF"></endpoint>

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
<host>
<ba seAddresses>
<add baseAddress="http://37.203.116.216:8080">

</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="49A9D589CEAF5705EF06C7F5C7A9EA927735C9BD"
storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="AssistantHost.CustomUserNameValidator,AssistantHost" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
10. Xershi 1473 11.07.20 10:02 Сейчас в теме
(1) смотри уроки. Есть бесплатный курс Гилева 5 дней мобильной разработки там в том числе про веб сервисы рассказывают.
11. uno-c 234 11.07.20 10:44 Сейчас в теме
(10) Это не веб-сервис в терминах 1С, потому как SOAP здесь не используется.
4. uno-c 234 10.07.20 16:57 Сейчас в теме
Конкретный сертификат можно например так подключить:

СертификатКлиентаФайл = Новый СертификатКлиентаФайл("c:\tmp\mysert.pfx", ПарольСертификата);
ССЛ = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиентаФайл);
HTTPСоединение = Новый HTTPСоединение("37.203.116.216",8080,Логин,Пароль,,,ССЛ);
6. k9260130000 27 10.07.20 20:35 Сейчас в теме
Сделал вот так:

SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("C:\P12\111.pfx","myparol"));
Определение = Новый WSОпределения("http://37.203.116.216:8080/?wsdl","test1","1tset",,,SSL);
Прокси = Новый WSПрокси(Определение,"http://tempuri.org/","AssistantWCF","WSHttpBinding_IAssistantWCF");
строка = Прокси.ActualVersion();

Прокси создаётся(если погасить веб-сервис не создаётся). Но при попытке воспользоваться сервисом получаю:

При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://tempuri.org/}:AssistantWCF:ActualVersion()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка работы с Интернет: Failure when receiving data from the peer
по причине:
Ошибка работы с Интернет: Failure when receiving data from the peer

Код в C# для получения объекта client (вызывает функции веб-сервиса - например client.ActualVersion() ) :

public static AssistantWCF.AssistantWCFClient MakeConnection()
{
var client = new AssistantWCF.AssistantWCFClient("WSHttpBinding_IAssistantWCF", "http://37.203.246.206:8080/AssistantServer.AssistantServer");
client.ClientCredentials.UserName.UserName = "test1";
client.ClientCredentials.UserName.Password = "1tset";
var store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var certificate = store.Certificates.Find(X509FindType.FindByThumbprint, "49A9D589CEAF5705EF06C7F5C7A9EA927735C9BD", false);
client.ClientCredentials.ClientCertificate.Certificate = certificate[0];
client.ClientCredentials.ServiceCertificate.DefaultCertificate = certificate[0];
return client;
}
7. uno-c 234 11.07.20 00:58 Сейчас в теме
(6) WSОпределения, WSПрокси и прочие WS - сделаны в 1С чтобы по протоколу SOAP удобнее общаться, не писать вручную тело запросов. Эти WS* создают соответсвующие SOAP конверты, которые потом в тело POST запросов вставляются. Ваш веб-сервис на WCF вряд ли по SOAP работает, насколько понимаю, в нем по определению нет SOAPа.
12. k9260130000 27 11.07.20 13:29 Сейчас в теме
Всё же по SOAP Web-сервисы на WCF работают. Вот App.config ещё одного web-сервиса задуманного для локального использования. У него нет авторизации ни по логину и паролю , ни по сертификату.

<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IAssistantWCF" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="200000000">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
<security>
<message clientCredentialType="UserName" negotiateServiceCredential="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://37.203.246.206:8080/AssistantServer.AssistantServer"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IAssistantWCF"
contract="AssistantWCF.IAssistantWCF" name="WSHttpBinding_IAssistantWCF">
<identity>
<certificate encodedValue="AwAAAAEAAAAUAAAASanVic6vVwXvBsf1x6nqknc1yb0gAA­AAAQAAACsDAAAwggMnMIICD6ADAgECAhByCeHkwP7StUVznTGN5LgqMA0GCS­qGSIb3DQEBCwUAMBkxFzAVBgNVBAMMDjM3LjIwMy4yNDYuMjA2MB4XDTIwMD­YxODEyNTE0MVoXDTMwMDYxODEzMDEzOFowGTEXMBUGA1UEAwwOMzcuMjAzLj­I0Ni4yMDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmyDgg88­o6WDQe5feA0dQrNRpYcSRxUizaxfIsHVGhQLXJY4S4MN6oAHf8q/1XrpjvWt­6ygTOsWamkrRpQRmRcD1PYU+/eggWbTrdGLDsrBKobhC3d2oE9lAkZXZsi61­NhpR8E5eiCv15dFe2/JR9ebY+uBiaxwJ3I7trT0wt4D9OJxrRbBtRDMJK0q8­XaItC34NlBcQ6mg5N/IgK8S0txNTHByA9qCq9a0wHdvMbGRDtjYLemhp/T3E­IceZrM8PXLFIfG7Xqo+CcHm4XCUI6JoT26hg3t2fyzj9AfMrGuE31mRvkUj0­GqR0inTINwmE9vO8vDGu/m8K8bcKdxTTTTAgMBAAGjazBpMA4GA1UdDwEB/w­QEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwGQYDVR0RBB­IwEIIOMzcuMjAzLjI0Ni4yMDYwHQYDVR0OBBYEFPunFsspGoUsDbeHcB84xh­fQFE/sMA0GCSqGSIb3DQEBCwUAA4IBAQB9l19L1FWW4CvATPedG85ArOpe2y­revFG5AU97OMlGzQDBDq5aIpUtYyUhtcK3Qm+mESXRF9thJitBOc8VQzVPRO­e1VUg5d7mY9KSYZwAIYt/Q4lYwE4vQBAlC0hvDfNAmaolHbk+UH5icS+aMw1­lrc5A8w6Rz1VmqfZLZZFpf2oT+nnYOuo/04w/x42MWDC708bTdpvHP+S8F7C­OI+sfZLd9Mo+gv8xsVnjzkIrthZIrlem0Qyi3dsXWDM4nWMSgb0/ODiO5ktj­26AE/XEoElI3rkAE6nzKvJXLYJeX8IgM1mbKERNaYpjF1fc6+uEdLRT9VEs0­brA5h2UTo2Bj5O" />
</identity>
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>

<service name="ITXLocalService.WCFITXLocal">
<endpoint address="" binding="basicHttpBinding" contract="ITXLocalService.IWCFITXLocal">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<ba seAddresses>
<add baseAddress="http://localhost:8733/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>

К этому сервису удалось подключиться добавив его по url как WSСсылку.:


Прокси = WSСсылки.ITXLocal.СоздатьWSПрокси("http://tempuri.org/","WCFITXLocal","BasicHttpBinding_IWCFITXLocal");
строка = Прокси.ReadID();

В свою очередь этот сервис может работать с тем о котором говорилось ранее. Напрашивается идея о прокси web-сервисе. Но это как-то криво. Наверняка кто-то такое уже делал и знает точно что нужно поправить в коде 1С чтобы всё заработало. Ну или знает что такая конфигурация в текущий момент никак не заработает.
13. uno-c 234 12.07.20 10:29 Сейчас в теме
(12)
Всё же по SOAP Web-сервисы на WCF работают

https://docs.microsoft.com/ru-ru/dotnet/framework/wcf/feature-details/how-to-create-a-basic-wcf-web-http-service
Windows Communication Foundation (WCF) позволяет создать службу, предоставляющую конечную веб-точку. Сетевые конечные точки отправляют данные в виде XML-кода или JSON, без конверта SOAP.


Если у Вас SOAP - то по идее должен быть файл WSDL c описанием вебсервиса - его как раз и указывают в качестве WS-Ссылки.
14. uno-c 234 12.07.20 10:49 Сейчас в теме
(12)
К этому сервису удалось подключиться добавив его по url как WSСсылку

К этому сервису, видимо, правильнее обращаться так:
ХТТПСоединение = Новый HTTPСоединение("localhost",8733);
ХТТПЗапрос = Новый HTTPЗапрос("ReadID");
ХТТПОтвет = ХТТПСоединение.Получить(ХТТПЗапрос);
Сообщить(ХТТПОтвет.ПолучитьТелоКакСтроку());

Ибо этот сервис скорее всего - не SOAP. А если он не SOAP - то всякие WS*, в т.ч. WSПрокси, для него неуместны.
8. uno-c 234 11.07.20 01:15 Сейчас в теме
(6) Вообще у Вас сертификат не для проверки клиента, а для валидации сервера. Клиент проверяется по логину/паролю.

<serviceCertificate> Specifies a certificate used by a service to identify itself. This element is of type X509RecipientCertificateServiceElement.


Если бы данный сертификат должен был предоставить клиент - то было бы

<clientCertificate> Specifies the certificate to be used when the client certificate is available out-of-band. This element also specifies client certificate validation settings. This element is of type X509InitiatorCertificateServiceElement.
9. uno-c 234 11.07.20 01:42 Сейчас в теме
(6) Получается, либо сертификат сервера используется просто чтобы подписать тело ответа, либо после обращения к "http://37.203.246.206:8080/AssistantServer.AssistantServer" http-сервер присылает редирект, и клиент его автоматом отрабатывает, тогда скорее всего по адресу "https://37.203.246.206:????/AssistantServer.AssistantServer". Ну или совсем крайний случай - по http идет шифрованный трафик. Идет ли переадресация - можно увидеть в заголовках HTTPОтвета. Самое простое - если fiddler сможет показать содержание пакетов - то можно будет не гадать, а сразу ответить - попробуйте: fiddler4
5. uno-c 234 10.07.20 17:02 Сейчас в теме
Только не совсем непонятно, для чего сертификат у Вас используется. Если у Вас baseAddress="http..." - то возможно не происходит шифрования https, а сертификат используется как-то по другому ?
15. k9260130000 27 24.07.20 19:47 Сейчас в теме +1 $m
В конце концов выяснил что сервисы WCF могут быть вызваны сторонними решениями только через привязку basicHttpBinding. Т.е. в моём случае или прокси WCF-сервис. Или дополнительную привязку к основному.
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день