|
1С web-сервис, проблема с подключением из клиента C# WinRT | ☑ | ||
---|---|---|---|---|
0
manserg
09.05.13
✎
12:58
|
При попытке подключиться из тестового клиента на C# WinRT к нормально работающему web-сервису 1С, получаю следующее сообщение: The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm="1C:Enterprise 8.2"'."
Тестовый клиент создан на C# в Visual Studio 2012 из шаблона Windows Store с использованием .NET 4,5. Классы сгенерированы автоматически из WSDL через "Add Service Reference", однако теперь там нет возможности генерить Web Reference а только Service Reference. Пример кода тестового клиента: private void BtnCompany_Click(object sender, RoutedEventArgs e) { restcoachPortTypeClient Service = new restcoachPortTypeClient(); Service.ClientCredentials.UserName.UserName = "web"; Service.ClientCredentials.UserName.Password = "12345"; Service.ClientCredentials.HttpDigest.ClientCredential.UserName = "web"; Service.ClientCredentials.HttpDigest.ClientCredential.Password = "12345"; Service.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("web","12345",""); Service.OpenAsync(); System.Threading.Tasks.Task<PingResponse> PingAsync = Service.PingAsync(); PingResponse PingResult = PingAsync.Result; Service.CloseAsync(); } На форуме видел похожую тему: v8: веб сервис 1С не работает через клиента на C# Там была рекомендация использовать свойство "PreAuthenticate", однако так и не смог найти данное свойство у сгененрированных Service Reference. Был бы очень признателен за предоставление реально работающего примера клиента на C# под WinRT для 1С web-сервисов! |
|||
1
СуперГрид
09.05.13
✎
13:18
|
вот жесть то....
как бы винрт признали тупиковой и сняли с производства. вин8 - тоже ошибка природы. |
|||
2
manserg
19.05.13
✎
01:16
|
Up - Неужели никто не сталкивался с данной проблемой?
|
|||
3
Serginio1
19.05.13
✎
11:49
|
(1) Откуда такие сведения? WinRT 'nj Апи используемая как на x86 так и вин8 и Windows RT. http://www.digit.ru/business/20130517/401522676.html
a зачем тебе Service.ClientCredentials.HttpDigest.ClientCredential.UserName = "web"; Service.ClientCredentials.HttpDigest.ClientCredential.Password = "12345"; Авторизоция нужна для входа в 1С |
|||
4
manserg
19.05.13
✎
12:02
|
(3) Service.ClientCredentials.HttpDigest.ClientCredential.UserName = "web";
Service.ClientCredentials.HttpDigest.ClientCredential.Password = "12345"; Были использованы от безисходности решения проблемы аутентификации. Судя по всему Service Reference генерируемый автоматом в VS2012 невозможно заставить использовать PreAuthenticate параметр, по крайней мере мне этого не удалось. Проблема именно в том, что по умолчанию 1С web-service производит авторизацию по данным заголовка SOAP запроса а уже потом на уровне сервиса. В общем эксперименты продолжаются, но надежды заставить нормально работать Service Reference тают на глазах... |
|||
5
manserg
19.05.13
✎
12:10
|
(2) Не хотел даже отвечать на подобные высказывания, но решил все же развеять подобные мнения - MS Windows 8 весьма современное и перспективное решение, это признано многими уважаемыми аналитиками. А "ограничения" WinRT в основном в головах пользователей т.к. большинство привыкли к x86 Windows. То что WinRT будет только развиваться говорят хотябы официально озвученные планы многих уважаемых вендоров, которые уже заявили о скором выпуске множества устройств на WinRT.
Да и приведенная ссылка (3) подтверждает, что эра WP8 только на подходе. В любом случае, как говорится: поживем - увидим... |
|||
6
manserg
19.05.13
✎
12:17
|
п (2) в посте (5) читать, как п (1)
|
|||
7
Serginio1
19.05.13
✎
12:57
|
Лучше тебе такие вопросы задавать на спец форумах. RSDN или
stackoverflow.com Нужно смотреть это свойство у транспорта http://msdn.microsoft.com/ru-ru/library/system.net.webrequest.preauthenticate.aspx |
|||
8
Serginio1
19.05.13
✎
13:03
|
||||
9
Serginio1
19.05.13
✎
18:10
|
||||
10
manserg
19.05.13
✎
23:42
|
Уже перечитал массу статей на stackoverflow.com, кое-что нарыл, проверяю...
(7) Все бы ничего, да только WebRequest это не одно и тоже что Service Reference, более того, в WinRT используется .NET 4,5 а в нем много изменений и отличий от прежних frameworks. (8) аналогично, но за пример спасибо. (9) А вот это уже интересно, буду пробовать. Спасибо за участие, Serginio1! |
|||
11
Serginio1
20.05.13
✎
10:40
|
(10) Сам изучаю WCF и самому интересно. Там подключение может использовать разные биндинги
http://msdn.microsoft.com/ru-ru/library/system.servicemodel.basichttpbinding.aspx http://msdn.microsoft.com/ru-ru/library/system.servicemodel.wshttpbinding.aspx |
|||
12
AaNnDdRrEeYy
20.05.13
✎
10:48
|
У меня такое было, я вот так решил
v8: веб сервис 1С не работает через клиента на C# |
|||
13
Serginio1
20.05.13
✎
10:55
|
(12) Он кстати тебя там спрашивал
web-service развернут в Apache. Где и как устанавливать параметр PreAuthenticate? |
|||
14
AaNnDdRrEeYy
20.05.13
✎
11:05
|
TestWS - это прокси сервиса в 1с
using (TestWS vs = new TestWS()) { vs.PreAuthenticate = true; vs.Credentials = new System.Net.NetworkCredential("user1C", "pass1C"); vs.CreateTestDrive(orders); } |
|||
15
AaNnDdRrEeYy
20.05.13
✎
11:06
|
(13) только сейчас заметил что комуто это всетаки надо было
|
|||
16
Serginio1
20.05.13
✎
13:01
|
||||
17
AaNnDdRrEeYy
20.05.13
✎
14:01
|
(16) то что по первой ссылке можно тупо в app.config прописать, обычно оно само автоматом прописывается при импорте ссылки на сервис.
|
|||
18
Serginio1
20.05.13
✎
14:17
|
(17) Да смотрю я на WCF там все в основном через конфиг делается. Но видишь ошибку unauthorized with client authentication scheme 'Anonymous'
А ему нужен Basic |
|||
19
manserg
21.05.13
✎
01:15
|
(14) Так речь о Web Service Reference или Service Reference?
У меня как раз Service Reference можно только в WinRT сгенерить и соответственно у меня в сгенерированном proxy отсутсвует свойство PreAuthenticate |
|||
20
manserg
21.05.13
✎
01:21
|
(16) Спасибо, проверю эти варианты, отпишусь тогда по результату.
Пока удалось победить ошибку только используя HttpClient и в через HttpClientHandler установив PreAuthenticate = true; и Credentials = new NetworkCredential("web", "12345"); получить отсутсвие ошибки и нормальное завершение запроса. Теперь осталось разобраться с парсингом получаемых данных... Но конечно лучше все было бы реализовать через Service Reference как готовые классы. |
|||
21
manserg
21.05.13
✎
01:30
|
(17) Есть предположение, что в сгенерированном файле Reference.svcmap необходимо произвести соответствующие настройки, но вот разобраться какие и как их настроить пока не удалось.
На всякий случай пример этого файла: <?xml version="1.0" encoding="utf-8"?> <ReferenceGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="79edb112-65fd-4867-a06e-a6cea41d6506" xmlns="urn:schemas-microsoft-com:xml-wcfservicemap"> <ClientOptions> <GenerateAsynchronousMethods>false</GenerateAsynchronousMethods> <GenerateTaskBasedAsynchronousMethod>true</GenerateTaskBasedAsynchronousMethod> <EnableDataBinding>true</EnableDataBinding> <ExcludedTypes /> <ImportXmlTypes>false</ImportXmlTypes> <GenerateInternalTypes>false</GenerateInternalTypes> <GenerateMessageContracts>true</GenerateMessageContracts> <NamespaceMappings /> <CollectionMappings /> <GenerateSerializableTypes>false</GenerateSerializableTypes> <Serializer>Auto</Serializer> <UseSerializerForFaults>true</UseSerializerForFaults> <ReferenceAllAssemblies>true</ReferenceAllAssemblies> <ReferencedAssemblies /> <ReferencedDataContractTypes /> <ServiceContractMappings /> </ClientOptions> <MetadataSources> <MetadataSource Address="http://x.x.x.x:80/DemoAccounting/ws/restcoach.1cws?wsdl" Protocol="http" SourceId="1" /> </MetadataSources> <Metadata> <MetadataFile FileName="restcoach.wsdl" MetadataType="Wsdl" ID="7241b1db-5f99-4b77-88ac-454835fe03d2" SourceId="1" SourceUrl="http://x.x.x.x:80/DemoAccounting/ws/restcoach.1cws?wsdl" /> </Metadata> <Extensions> <ExtensionFile FileName="configuration91.svcinfo" Name="configuration91.svcinfo" /> <ExtensionFile FileName="configuration.svcinfo" Name="configuration.svcinfo" /> </Extensions> </ReferenceGroup> |
|||
22
Serginio1
21.05.13
✎
10:35
|
(20) Ну у тебя уже есть сгенеренные Сериализаторы. Так что самостоятельно парсингом заниматься не надо. Нужно разобраться Service Reference
|
|||
23
Serginio1
21.05.13
✎
10:45
|
Все там решают через Биндинг например
http://msdn.microsoft.com/en-us/library/ms733775.aspx WSHttpBinding myBinding = new WSHttpBinding(); myBinding.Security.Mode = SecurityMode.Transport; myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; // Create the endpoint address. Note that the machine name // must match the subject or DNS field of the X.509 certificate // used to authenticate the service. EndpointAddress ea = new EndpointAddress("https://machineName/Calculator"); // Create the client. The code for the calculator // client is not shown here. See the sample applications // for examples of the calculator code. CalculatorClient cc = new CalculatorClient(myBinding, ea); // The client must provide a user name and password. The code // to return the user name and password is not shown here. Use // a database to store the user name and passwords, or use the // ASP.NET Membership provider database. cc.ClientCredentials.UserName.UserName = ReturnUsername(); cc.ClientCredentials.UserName.Password = ReturnPassword(); try { // Begin using the client. cc.Open(); Console.WriteLine(cc.Add(100, 11)); Console.ReadLine(); // Close the client. cc.Close(); } |
|||
24
Serginio1
21.05.13
✎
11:21
|
Сейчас ради интереса создал приложение с ServiceReference
Там создался AppConfig с такой веткой, но без ветки <security mode="Transport"> <transport clientCredentialType="Basic" /> </security> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator" > <security mode="Transport"> <transport clientCredentialType="Basic" /> </security> </binding> </wsHttpBinding> создались конструкторы с параметрами public ИмяСервисаPortTypeClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } |
|||
25
Serginio1
21.05.13
✎
11:34
|
Если открыть через Edit WCF Configuration раскрыть ветку Bindings будет ветка ИмяСервисаBinding
Там вкладочка Security и ветка TransportSecurity Properties В свойстве transport clientCredentialType нужно установить Basic а вот realm наверное из твоего предупреждения или опустить |
|||
26
manserg
23.05.13
✎
00:54
|
(24) Спасибо конечно за развернутый пример, однако у меня в приложении на базе шаблона Windows Store нет AppConfig файла.
Подозреваю должна быть ему альтернатива... |
|||
27
manserg
23.05.13
✎
01:04
|
(23) Да, в сервисах созданных на C#, похоже нет пролем с подключением, однако проблемы наблюдаются при подключении к сервисам 1С.
Например 1С web-service генерит wsdl с методами версий soap 1.1 и 1.2, так вот пока приложения под WinRT при генерации Service Reference четко говорят, что не поддерживается формат версии soap 1.2 т.ч. пришлось вручную исключать из wsdl блоки версии 1.2 В приложении под WinRT вообще много изменено относительно привычного строения приложения под Windows x86. |
|||
28
manserg
23.05.13
✎
01:08
|
(23) Биндинг корректный при генерации Service Reference, т.ч. особого смысла не вижу его генерить вручную. Логин и пароль указал, но результат мною уже озвучен в первом посте.
От безысходности попробую пожалуй полностью вручную прописать биндинг вдруг действительно поможет... |
|||
29
manserg
23.05.13
✎
01:11
|
(25) Прости - вообще не понял что и где открыть.
У меня в приложении есть любопытный файл "ServiceReferences.Designer.ClientConfig" со следующим содержимым: <configuration> <configSections> </configSections> </configuration> Быть может в нем нужно что то прописывать? |
|||
30
manserg
23.05.13
✎
01:17
|
Вот еще любопытный файл "configuration.svcinfo" в разделе сгенерированного Service Reference со следующим содержимым:
<?xml version="1.0" encoding="utf-8"?> <configurationSnapshot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:xml-wcfconfigurationsnapshot"> <behaviors /> <bindings /> <endpoints /> </configurationSnapshot> Может в нем все прописывается? |
|||
31
Serginio1
23.05.13
✎
10:54
|
Посмотри http://msdn.microsoft.com/ru-ru/library/ms732009.aspx
Кстати а какие конфигурационные файлы в Solution Explorer? http://forums.lhotka.net/forums/p/11649/53966.aspx Типа Там больше нет файла app.config в WinRT так конфигурации должно быть сделано в коде. Для SimpleApp это делается в App.xaml.cs - OnLainched событие в коде. protected override void OnLaunched(LaunchActivatedEventArgs args) { Csla.ApplicationContext.DataPortalProxy = typeof(Csla.DataPortalClient.WcfProxy).AssemblyQualifiedName; Csla.ApplicationContext.DataPortalUrlString = "http://localhost:19454/MobilePortal.svc"; |
|||
32
Serginio1
23.05.13
✎
10:56
|
Биндинг нормальный но ему нужно указать SecurityMode
WSHttpBinding myBinding = new WSHttpBinding(); myBinding.Security.Mode = SecurityMode.Transport; myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; EndpointAddress ea = new EndpointAddress(ТвойАдрес); // Create the client. The code for the calculator // client is not shown here. See the sample applications // for examples of the calculator code. restcoachPortTypeClient Service = new restcoachPortTypeClient(myBinding, ea); |
|||
33
manserg
24.05.13
✎
00:55
|
(32) Спасибо за идею, заработал клиент со следующим кодом:
BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; EndpointAddress ea = new EndpointAddress("http://x.x.x.x:80/DemoAccounting/ws/restcoach.1cws"); restcoachPortTypeClient Service = new restcoachPortTypeClient(myBinding, ea); Service.ClientCredentials.UserName.UserName = "web"; Service.ClientCredentials.UserName.Password = "12345"; Service.OpenAsync(); System.Threading.Tasks.Task<PingResponse> PingAsync = Service.PingAsync(); PingResponse PingResult = PingAsync.Result; System.Threading.Tasks.Task<String> GetVersions = Service.GetVersionsAsync(); String GetVersionsResult = GetVersions.Result; Service.CloseAsync(); Всем еще раз спасибо за участие! |
|||
34
Serginio1
24.05.13
✎
13:44
|
(33) Вообще для справки
[url=http://msdn.microsoft.com/ru-ru/library/system.servicemodel.wshttpbinding.aspx]WSHttpBinding - класс[/url] [q] S>Представляет привязку с возможностью взаимодействия, поддерживающую распределенные транзакции и [b]безопасные надежные сеансы[/b]. [/q] WSHttpBindingBase.ReliableSession - свойство типа [url=http://msdn.microsoft.com/ru-ru/library/system.servicemodel.optionalreliablesession.aspx]OptionalReliableSession[/url] |
|||
35
Serginio1
24.05.13
✎
13:50
|
Короче есть Класс WSHttpBinding http://msdn.microsoft.com/ru-ru/library/system.servicemodel.wshttpbinding.aspx
Представляет привязку с возможностью взаимодействия, поддерживающую распределенные транзакции и безопасные надежные сеансы. WSHttpBindingBase.ReliableSession - свойство типа OptionalReliableSession http://msdn.microsoft.com/ru-ru/library/system.servicemodel.optionalreliablesession.aspx http://msdn.microsoft.com/ru-ru/library/ms951271.aspx |
|||
36
manserg
25.05.13
✎
09:39
|
(35) Да то понятно, что есть, да вот в .NET 4.5 for WinRT его я не нашел и пришлось использовать BasicHttpBinding.
Вот статья с описание различий между WsHttpBinding и BasicHttpBinding: http://www.codeproject.com/Articles/36396/Difference-between-BasicHttpBinding-and-WsHttpBind И судя по всему мало того, что в WinRT пока поддерживается только SOAP 1.1, так еще думаю на стороне 1С скорей всего пока не поддерживаются никакие шифрования заявленные в WsHttpBinding. |
|||
37
Serginio1
25.05.13
✎
12:00
|
(36) Говорят с выходом Windows 8.1 многое изменится.
В 8.3 обещаяют Реализована поддержка защищённого соединения SSL и сертификатов во всех механизмах платформы, использующих Интернет: Тонкий клиент (как для Windows, так и для Linux), Web-сервисы 1С:Предприятия, Объекты встроенного языка, реализующие работу по протоколам FTP и HTTP, Интернет-почта. Могут использоваться сертификаты из стандартного хранилища операционной системы или из файла. Настроить использование сертификатов можно через командную строку или в диалоге параметров запуска информационной базы. http://v8.1c.ru/overview/release_8_3_1/ |
|||
38
Serginio1
25.05.13
✎
12:12
|
||||
39
manserg
25.05.13
✎
21:47
|
(37) Да, ожидаю с нетерпением изменений к лучшему, т.к. текущая реализация WinRT оставляет жалать лучшего.
И продакшн 1С 8.3 тоже очень ждемс... Но делать то нужно сейчас, т.ч. извращаемся и делаем на том, что есть. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |