Интеграция 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 1479 11.07.20 10:02 Сейчас в теме
(1) смотри уроки. Есть бесплатный курс Гилева 5 дней мобильной разработки там в том числе про веб сервисы рассказывают.
11. uno-c 235 11.07.20 10:44 Сейчас в теме
(10) Это не веб-сервис в терминах 1С, потому как SOAP здесь не используется.
4. uno-c 235 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 235 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 235 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 235 12.07.20 10:49 Сейчас в теме
(12)
К этому сервису удалось подключиться добавив его по url как WSСсылку

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

Ибо этот сервис скорее всего - не SOAP. А если он не SOAP - то всякие WS*, в т.ч. WSПрокси, для него неуместны.
8. uno-c 235 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 235 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 235 10.07.20 17:02 Сейчас в теме
Только не совсем непонятно, для чего сертификат у Вас используется. Если у Вас baseAddress="http..." - то возможно не происходит шифрования https, а сертификат используется как-то по другому ?
15. k9260130000 27 24.07.20 19:47 Сейчас в теме +1 $m
В конце концов выяснил что сервисы WCF могут быть вызваны сторонними решениями только через привязку basicHttpBinding. Т.е. в моём случае или прокси WCF-сервис. Или дополнительную привязку к основному.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот