Добрый день !
Имеется веб-сервис на WCF. В настоящий момент его могут использовать написанные на C# программы. Хочу научить 1С вызывать функции на стороне этого веб-сервиса. Для авторизации используются сертификат и логин с паролем. Не подскажете как бы мне провернуть такое ?
15.
k9260130000
2724.07.20 19:47 Сейчас в теме+1 $m
В конце концов выяснил что сервисы WCF могут быть вызваны сторонними решениями только через привязку basicHttpBinding. Т.е. в моём случае или прокси WCF-сервис. Или дополнительную привязку к основному.
(1) Ну не важно на чем его вызывали, можно реализовать и на 1С.
Что бы провернуть такое, надо получить документацию по подключению к веб сервису.
И уже методами 1С подключаться.
Скорее всего метод будет такой
HTTPСоединение = Новый HTTPСоединение("Адрес",,Пользователь,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL());
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Только еще сертификат надо добавить. Но без документации как работает сервис, ничего не получится (методы, способ авторизации).
Конкретный сертификат можно например так подключить:
СертификатКлиентаФайл = Новый СертификатКлиентаФайл("c:\tmp\mysert.pfx", ПарольСертификата);
ССЛ = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиентаФайл);
HTTPСоединение = Новый HTTPСоединение("37.203.116.216",8080,Логин,Пароль,,,ССЛ);
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;
}
(6) WSОпределения, WSПрокси и прочие WS - сделаны в 1С чтобы по протоколу SOAP удобнее общаться, не писать вручную тело запросов. Эти WS* создают соответсвующие SOAP конверты, которые потом в тело POST запросов вставляются. Ваш веб-сервис на WCF вряд ли по SOAP работает, насколько понимаю, в нем по определению нет SOAPа.
Всё же по SOAP Web-сервисы на WCF работают. Вот App.config ещё одного web-сервиса задуманного для локального использования. У него нет авторизации ни по логину и паролю , ни по сертификату.
В свою очередь этот сервис может работать с тем о котором говорилось ранее. Напрашивается идея о прокси web-сервисе. Но это как-то криво. Наверняка кто-то такое уже делал и знает точно что нужно поправить в коде 1С чтобы всё заработало. Ну или знает что такая конфигурация в текущий момент никак не заработает.
Windows Communication Foundation (WCF) позволяет создать службу, предоставляющую конечную веб-точку. Сетевые конечные точки отправляют данные в виде XML-кода или JSON, без конверта SOAP.
Если у Вас SOAP - то по идее должен быть файл WSDL c описанием вебсервиса - его как раз и указывают в качестве WS-Ссылки.
(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.
(6) Получается, либо сертификат сервера используется просто чтобы подписать тело ответа, либо после обращения к "http://37.203.246.206:8080/AssistantServer.AssistantServer" http-сервер присылает редирект, и клиент его автоматом отрабатывает, тогда скорее всего по адресу "https://37.203.246.206:????/AssistantServer.AssistantServer". Ну или совсем крайний случай - по http идет шифрованный трафик. Идет ли переадресация - можно увидеть в заголовках HTTPОтвета. Самое простое - если fiddler сможет показать содержание пакетов - то можно будет не гадать, а сразу ответить - попробуйте: fiddler4
Только не совсем непонятно, для чего сертификат у Вас используется. Если у Вас baseAddress="http..." - то возможно не происходит шифрования https, а сертификат используется как-то по другому ?
15.
k9260130000
2724.07.20 19:47 Сейчас в теме+1 $m
В конце концов выяснил что сервисы WCF могут быть вызваны сторонними решениями только через привязку basicHttpBinding. Т.е. в моём случае или прокси WCF-сервис. Или дополнительную привязку к основному.