Имя: Пароль:
1C
Мобильный мир
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 тоже очень ждемс...
Но делать то нужно сейчас, т.ч. извращаемся и делаем на том, что есть.
Ошибка? Это не ошибка, это системная функция.