Вход | Регистрация
 
1С:Предприятие :: Мобильный мир

1С web-сервис, проблема с подключением из клиента C# WinRT

1С web-сервис, проблема с подключением из клиента C# WinRT
Я
   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 - тоже ошибка природы.
   manserg
 
2 - 19.05.13 - 01:16
Up - Неужели никто не сталкивался с данной проблемой?
   Serginio1
 
3 - 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С
   manserg
 
4 - 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 тают на глазах...
   manserg
 
5 - 19.05.13 - 12:10
(2) Не хотел даже отвечать на подобные высказывания, но решил все же развеять подобные мнения - MS Windows 8 весьма современное и перспективное решение, это признано многими уважаемыми аналитиками. А "ограничения" WinRT в основном в головах пользователей т.к. большинство привыкли к x86 Windows. То что WinRT будет только развиваться говорят хотябы официально озвученные планы многих уважаемых вендоров, которые уже заявили о скором выпуске множества устройств на WinRT.
Да и приведенная ссылка (3) подтверждает, что эра WP8 только на подходе.
В любом случае, как говорится: поживем - увидим...
   manserg
 
6 - 19.05.13 - 12:17
п (2) в посте (5) читать, как п (1)
   Serginio1
 
7 - 19.05.13 - 12:57
Лучше тебе такие вопросы задавать на спец форумах. RSDN или
stackoverflow.com
Нужно смотреть это свойство у транспорта
http://msdn.microsoft.com/ru-ru/library/system.net.webrequest.preauthenticate.aspx
   Serginio1
 
8 - 19.05.13 - 13:03
   Serginio1
 
9 - 19.05.13 - 18:10
   manserg
 
10 - 19.05.13 - 23:42
Уже перечитал массу статей на stackoverflow.com, кое-что нарыл, проверяю...
(7) Все бы ничего, да только WebRequest это не одно и тоже что Service Reference, более того, в WinRT используется .NET 4,5 а в нем много изменений и отличий от прежних frameworks.
(8) аналогично, но за пример спасибо.
(9) А вот это уже интересно, буду пробовать.
Спасибо за участие, Serginio1!
   Serginio1
 
11 - 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
   AaNnDdRrEeYy
 
12 - 20.05.13 - 10:48
У меня такое было, я вот так решил
v8: веб сервис 1С не работает через клиента на C#
   Serginio1
 
13 - 20.05.13 - 10:55
(12) Он кстати тебя там спрашивал
web-service развернут в Apache.
Где и как устанавливать параметр PreAuthenticate?
   AaNnDdRrEeYy
 
14 - 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);
}
   AaNnDdRrEeYy
 
15 - 20.05.13 - 11:06
(13) только сейчас заметил что комуто это всетаки надо было
   Serginio1
 
16 - 20.05.13 - 13:01
   AaNnDdRrEeYy
 
17 - 20.05.13 - 14:01
(16) то что по первой ссылке можно тупо в app.config прописать, обычно оно само автоматом прописывается при импорте ссылки на сервис.
   Serginio1
 
18 - 20.05.13 - 14:17
(17) Да смотрю я на WCF там все в основном через конфиг делается. Но видишь ошибку unauthorized with client authentication scheme 'Anonymous'
 А ему нужен Basic
   manserg
 
19 - 21.05.13 - 01:15
(14) Так речь о Web Service Reference или Service Reference?
У меня как раз Service Reference можно только в WinRT сгенерить и соответственно у меня в сгенерированном proxy отсутсвует свойство PreAuthenticate
   manserg
 
20 - 21.05.13 - 01:21
(16) Спасибо, проверю эти варианты, отпишусь тогда по результату.
Пока удалось победить ошибку только используя HttpClient и в через HttpClientHandler установив PreAuthenticate = true; и Credentials = new NetworkCredential("web", "12345"); получить отсутсвие ошибки и нормальное завершение запроса. Теперь осталось разобраться с парсингом получаемых данных...
Но конечно лучше все было бы реализовать через Service Reference как готовые классы.
   manserg
 
21 - 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>
   Serginio1
 
22 - 21.05.13 - 10:35
(20) Ну у тебя уже есть сгенеренные Сериализаторы. Так что самостоятельно парсингом заниматься не надо. Нужно разобраться Service Reference
   Serginio1
 
23 - 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();
}
   Serginio1
 
24 - 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) {
       }
   Serginio1
 
25 - 21.05.13 - 11:34
Если открыть через Edit WCF Configuration раскрыть ветку Bindings будет ветка ИмяСервисаBinding
Там вкладочка Security
и ветка TransportSecurity Properties
В свойстве transport clientCredentialType нужно установить Basic а вот realm наверное из твоего предупреждения или опустить
   manserg
 
26 - 23.05.13 - 00:54
(24) Спасибо конечно за развернутый пример, однако у меня в приложении на базе шаблона Windows Store нет AppConfig файла.
Подозреваю должна быть ему альтернатива...
   manserg
 
27 - 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.
   manserg
 
28 - 23.05.13 - 01:08
(23) Биндинг корректный при генерации Service Reference, т.ч. особого смысла не вижу его генерить вручную. Логин и пароль указал, но результат мною уже озвучен в первом посте.
От безысходности попробую пожалуй полностью вручную прописать биндинг вдруг действительно поможет...
   manserg
 
29 - 23.05.13 - 01:11
(25) Прости - вообще не понял что и где открыть.

У меня в приложении есть любопытный файл "ServiceReferences.Designer.ClientConfig" со следующим содержимым:
<configuration>
    <configSections>
    </configSections>
</configuration>

Быть может в нем нужно что то прописывать?
   manserg
 
30 - 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>

Может в нем все прописывается?
 
 
   Serginio1
 
31 - 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\";
   Serginio1
 
32 - 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);
   manserg
 
33 - 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();

Всем еще раз спасибо за участие!
   Serginio1
 
34 - 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]
   Serginio1
 
35 - 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
   manserg
 
36 - 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.
   Serginio1
 
37 - 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/
   Serginio1
 
38 - 25.05.13 - 12:12
   manserg
 
39 - 25.05.13 - 21:47
(37) Да, ожидаю с нетерпением изменений к лучшему, т.к. текущая реализация WinRT оставляет жалать лучшего.
И продакшн 1С 8.3 тоже очень ждемс...
Но делать то нужно сейчас, т.ч. извращаемся и делаем на том, что есть.


Список тем форума
 
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.