Интеграция 1С и веб-сервиса на WCF
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Ну не важно на чем его вызывали, можно реализовать и на 1С.
Что бы провернуть такое, надо получить документацию по подключению к веб сервису.
И уже методами 1С подключаться.
Скорее всего метод будет такой
Только еще сертификат надо добавить. Но без документации как работает сервис, ничего не получится (методы, способ авторизации).
Что бы провернуть такое, надо получить документацию по подключению к веб сервису.
И уже методами 1С подключаться.
Скорее всего метод будет такой
HTTPСоединение = Новый HTTPСоединение("Адрес",,Пользователь,Пароль,,,Новый ЗащищенноеСоединениеOpenSSL());
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);Только еще сертификат надо добавить. Но без документации как работает сервис, ничего не получится (методы, способ авторизации).
(2)
Сервис сам писал на 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>
учить документацию по подключению к веб сервису.
И уже методами 1С подключаться.
Скорее всего метод будет такой
И уже методами 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>
Конкретный сертификат можно например так подключить:
СертификатКлиентаФайл = Новый СертификатКлиентаФайл("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();
Прокси создаётся(если погасить веб-сервис не создаётся). Но при попытке воспользоваться сервисом получаю:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {}: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;
}
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();
Прокси создаётся(если погасить веб-сервис не создаётся). Но при попытке воспользоваться сервисом получаю:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {}: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-сервиса задуманного для локального использования. У него нет авторизации ни по логину и паролю , ни по сертификату.
<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С чтобы всё заработало. Ну или знает что такая конфигурация в текущий момент никак не заработает.
<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
</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С чтобы всё заработало. Ну или знает что такая конфигурация в текущий момент никак не заработает.
(12)
Если у Вас SOAP - то по идее должен быть файл WSDL c описанием вебсервиса - его как раз и указывают в качестве WS-Ссылки.
Всё же по SOAP Web-сервисы на WCF работают
Windows Communication Foundation (WCF) позволяет создать службу, предоставляющую конечную веб-точку. Сетевые конечные точки отправляют данные в виде XML-кода или JSON, без конверта SOAP.
Если у Вас SOAP - то по идее должен быть файл WSDL c описанием вебсервиса - его как раз и указывают в качестве WS-Ссылки.
(12)
К этому сервису, видимо, правильнее обращаться так:
Ибо этот сервис скорее всего - не SOAP. А если он не SOAP - то всякие WS*, в т.ч. WSПрокси, для него неуместны.
К этому сервису удалось подключиться добавив его по url как WSСсылку
К этому сервису, видимо, правильнее обращаться так:
ХТТПСоединение = Новый HTTPСоединение("localhost",8733);
ХТТПЗапрос = Новый HTTPЗапрос("ReadID");
ХТТПОтвет = ХТТПСоединение.Получить(ХТТПЗапрос);
Сообщить(ХТТПОтвет.ПолучитьТелоКакСтроку());Ибо этот сервис скорее всего - не SOAP. А если он не SOAP - то всякие WS*, в т.ч. 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, а сертификат используется как-то по другому ?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
