Имя: Пароль:
1C
1С v8
Подключение к веб сервису 1С из платформы Windows Phone
0 ditron
 
18.12.13
12:15
Добрый день, уважаемые!
Подскажите, кто нибудь сталкивался с подключением и обменом с веб сервисом 1С 8.2 из приложения написанного под Windows Phone (VS)
1 Balonbl4
 
18.12.13
12:23
А что, есть какие-то подводные камни?
ЗЫ: недавно делал синхронизацию с Eхchange по веб-сервисам - вот там реально жесть.
2 Serginio1
 
18.12.13
12:26
3 ditron
 
18.12.13
12:50
Да все как у Калиновского, но! сервис по https находится
4 Serginio1
 
18.12.13
12:52
Тебе лучше сюда вопрос задать http://www.rsdn.ru
5 ditron
 
18.12.13
12:53
может у меня уже глаз замылился, вот код:
namespace AxorMobileClient
{
    public partial class MainPage : PhoneApplicationPage
    {
        const string wsUser = "********";
        const string wsPwd  = "********";

        public string User;
        public string Pwd;

        public WSMobileClientPortTypeClient _WSClient = new WSMobileClientPortTypeClient();

        // Конструктор
        public MainPage()
        {
            InitializeComponent();

            User = IsolatedStorageSettings.ApplicationSettings.LoadSetting("User", "");
            Pwd = IsolatedStorageSettings.ApplicationSettings.LoadSetting("Pwd", "");

            _WSClient.OpenCompleted += new EventHandler<AsyncCompletedEventArgs>(_WSClient_OpenCompleted);
            _WSClient.CheckConnectionCompleted += new EventHandler<CheckConnectionCompletedEventArgs>(_WSClient_CheckConnectionCompleted);
            _WSClient.GetClientInfoCompleted += new EventHandler<GetClientInfoCompletedEventArgs>(_WSClient_GetClientInfoCompleted);
            _WSClient.GetTreeOrdersCompleted += new EventHandler<GetTreeOrdersCompletedEventArgs>(_WSClient_GetTreeOrdersCompleted);
            _WSClient.GetRestGoodsCompleted += new EventHandler<GetRestGoodsCompletedEventArgs>(_WSClient_GetRestGoodsCompleted);
            
            _WSClient.ClientCredentials.UserName.UserName = wsUser;
            _WSClient.ClientCredentials.UserName.Password = wsPwd;
            _WSClient.OpenAsync();
        }

        private void _WSClient_OpenCompleted(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Opened");
        }
        
        // CheckConnection()
        private void WSCheckConnection(string User, string Pwd)
        {
            _WSClient.CheckConnectionAsync(User, Pwd);
        }
        // EventHandler of CheckConnection
        private void _WSClient_CheckConnectionCompleted(object sender, CheckConnectionCompletedEventArgs e)
        {
            throw new NotImplementedException();
        }

        // GetClientInfo()
        private void WSGetClientInfo(string User, string Pwd)
        {
            //_WSClient.OpenAsync();
            _WSClient.GetClientInfoAsync(User, Pwd);
        }

        // EventHandler of GetClientInfo
        void _WSClient_GetClientInfoCompleted(object sender, GetClientInfoCompletedEventArgs e)
        {
            ClientInfo.Text = e.Result;
        }

        // GetTreeOrders()
        private void WSGetTreeOrders(string User, string Pwd)
        {
            //_WSClient.OpenAsync();
            _WSClient.GetTreeOrdersAsync(User, Pwd, null, null);
        }
        // EventHandler of GetTreeOrders
        void _WSClient_GetTreeOrdersCompleted(object sender, GetTreeOrdersCompletedEventArgs e)
        {
            //TextBlock1.Text = e.Result;
        }

        // GetRestGoods()
        private void WSGetRestGoods(string User, string Pwd)
        {
            _WSClient.GetRestGoodsAsync(User, Pwd, false);
        }
        // EventHandler of GetRestGoods
        void _WSClient_GetRestGoodsCompleted(object sender, GetRestGoodsCompletedEventArgs e)
        {
            //TextBlock1.Text = e.Result;
        }


        private void btnUpdate_Click(object sender, EventArgs e)
        {
            switch (pPanel.SelectedIndex)
            {
                case 0:
                    {
                        WSGetClientInfo(User, Pwd);
                        break;
                    }
                case 1:
                    {
                        WSGetRestGoods(User, Pwd);
                        break;
                    }
                case 2:
                    {
                        WSGetTreeOrders(User, Pwd);
                        break;
                    }
            }
        }


        private void miSettings_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/SettingsPage.xaml", UriKind.Relative));
        }

    }
}
6 ditron
 
18.12.13
13:00
то 1
Судя по всему есть
7 Serginio1
 
18.12.13
13:24
8 ditron
 
18.12.13
13:48
7 - спасибо конечно, но это установка сертификата на симулятор, а я отлаживаю на реальном девайсе. У меня в исключении ругается не на сертификат.

Сначала ругался "The remote server returned an unexpected response: (401) Unauthorized. In Silverlight, a 404 response code may be reported even when the service sends a different error code.", потом включил на IIS-е (где служба опубликована) ASP.NET Impersonation , теперь другая ругань в дебаге:
        
"The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"/>\r\n<title>500 - Internal server error.</title>\r\n<style type=\"text/css\">\r\n<!--\r\nbody{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}\r\nfieldset{padding:0 15px 10px 15px;} \r\nh1{font-size:2.4em;margin:0;color:#FFF;}\r\nh2{font-size:1.7em;margin:0;color:#CC0000;} \r\nh3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} \r\n#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:\"trebuchet MS\", Verdana, sans-serif;color:#FFF;\r\nbackground-color:#555555;}\r\n#content{margin:0 0 0 2%;position:relative;}\r\n.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}\r\n-->\r\n</style>\r\n</head>\r\n<body>\r\n<div id=\"header\"><h1>Server Error</h1></div>\r\n<div id=\"content\">\r\n <div class=\"content-container\"><fieldset>\r\n '."
9 ditron
 
18.12.13
13:51
Я так понимаю не в том формате реквест приходит
10 Serginio1
 
18.12.13
14:12
11 Serginio1
 
18.12.13
15:08
А с декстопа подключаешься?
12 Serginio1
 
18.12.13
15:18
13 Serginio1
 
18.12.13
16:00
(8) Кстати помню такая ошибочка у меня была при соедининнии без config  файла
v8: 1С web-сервис, проблема с подключением из клиента C# WinRT
14 ditron
 
18.12.13
16:49
13 эту ветку я уже изучал, а с дескотопа только в браузере, база опубликована полностью, в ней клиенты(покупатели) работают, клиент "мобильная платформа" работает под Андроид, чудесно, все те-же процедуры юзаю (Web-сервисы), а вот пишу для клиентов у которых Windows Phone на C# и застрял
15 ditron
 
18.12.13
16:50
А вот (10) это уже интересно, сейчас попробуем...
16 ditron
 
18.12.13
16:51
Я думаю дело все таки в заглушке сертификата
17 ditron
 
18.12.13
17:22
( это жесть... не получается, в (10) статья отличная но для десктопной SDK, а в WP оказывается не все реализовано
18 Serginio1
 
18.12.13
18:57
(14) Я имел ввиду с декстопа WCF. А какую ошибку выдает?
Вспомнил ошибку типа (8) выдавала когда изменения в Вэб сервисе происходили.
19 ditron
 
18.12.13
19:07
По поводу (8) - ее уже нет, это было один раз когда я в ИИС включил ASP.net impersonation, но уже выключил иначе перестала служба вообще работать в том числе и вэб клиент
20 ditron
 
18.12.13
19:10
ошибка одна:
"The remote server returned an unexpected response: (401) Unauthorized. In Silverlight, a 404 response code may be reported even when the service sends a different error code."

уже пробую конект по разному, и на прямую к локальному ИП где база опубликована, и через инет к https, меняя при этом "секурити моде"
21 Serginio1
 
18.12.13
20:21
22 Serginio1
 
18.12.13
20:22
23 ditron
 
19.12.13
11:25
Ерунда это все, здесь что-то с авторизацией 1С в службе, я уже удалил Сервис из проекта и добавил новый с локальным IP без всякого шифрования, с телефона (он в локалке) страница службы открывается...
24 Serginio1
 
19.12.13
11:35
У тебя и ошибка другая чем здесь v8: 1С web-сервис, проблема с подключением из клиента C# WinRT
А с Декстопа то нормально соединяется?
25 ditron
 
19.12.13
11:47
Да, другая. В смысле с десктопа?
26 ditron
 
19.12.13
11:54
Есть IIS сервер, на нем опубликована база (точнее три), одна публикация локальная в домен(для обмена с остальными двумя), вторая наружу (HTTPS), клиенты через Веб клиент работают. Все работает чудесно, девайс свой отладочный ввел в локалку через WI-FI в браузере ввожу локальный адрес службы (http://172.25.88.18/axor/ws/ws_mc.1cws?wsdl), открывается (после ввода логин-пароль) XML файл, как и должно быть, что не так не пойму, я так понимаю он не может пройти авторизацию 1С
27 ditron
 
19.12.13
11:58
конфиг службы в решении:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="WSMobileClientSoapBinding" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://172.25.88.18/axor/ws/ws_mc.1cws"; binding="basicHttpBinding"
                bindingConfiguration="WSMobileClientSoapBinding" contract="AxorReference.WSMobileClientPortType"
                name="WSMobileClientSoap" />
        </client>
    </system.serviceModel>
</configuration>

код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using AxorMobileClient.AxorReference;
using System.ServiceModel;
using System.ComponentModel;
using System.IO.IsolatedStorage;

namespace AxorMobileClient
{
    public partial class MainPage : PhoneApplicationPage
    {
        const string wsUser = "******";
        const string wsPwd  = "******";

        public static string User;
        public static string Pwd;
        
        public WSMobileClientPortTypeClient _WSClient;

        // Конструктор
        public MainPage()
        {
            InitializeComponent();

            User = IsolatedStorageSettings.ApplicationSettings.LoadSetting("User", "");
            Pwd = IsolatedStorageSettings.ApplicationSettings.LoadSetting("Pwd", "");

            _WSClient = new WSMobileClientPortTypeClient();
            _WSClient.ClientCredentials.UserName.UserName = wsUser;
            _WSClient.ClientCredentials.UserName.Password = wsPwd;

            _WSClient.OpenCompleted += new EventHandler<AsyncCompletedEventArgs>(_WSClient_OpenCompleted);
            _WSClient.CheckConnectionCompleted += new EventHandler<CheckConnectionCompletedEventArgs>(_WSClient_CheckConnectionCompleted);
            _WSClient.GetClientInfoCompleted += new EventHandler<GetClientInfoCompletedEventArgs>(_WSClient_GetClientInfoCompleted);
            _WSClient.GetTreeOrdersCompleted += new EventHandler<GetTreeOrdersCompletedEventArgs>(_WSClient_GetTreeOrdersCompleted);
            _WSClient.GetRestGoodsCompleted += new EventHandler<GetRestGoodsCompletedEventArgs>(_WSClient_GetRestGoodsCompleted);

            _WSClient.OpenAsync();
        }

        private void _WSClient_OpenCompleted(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Opened");
        }
        
        // CheckConnection()
        private void WSCheckConnection(string User, string Pwd)
        {
            _WSClient.CheckConnectionAsync(User, Pwd);
        }
        // EventHandler of CheckConnection
        private void _WSClient_CheckConnectionCompleted(object sender, CheckConnectionCompletedEventArgs e)
        {
            throw new NotImplementedException();
        }

        // GetClientInfo()
        private void WSGetClientInfo(string User, string Pwd)
        {
            _WSClient.GetClientInfoAsync(User, Pwd);
        }

        // EventHandler of GetClientInfo
        void _WSClient_GetClientInfoCompleted(object sender, GetClientInfoCompletedEventArgs e)
        {
            ClientInfo.Text = e.Result;
        }

        // GetTreeOrders()
        private void WSGetTreeOrders(string User, string Pwd)
        {
            _WSClient.GetTreeOrdersAsync(User, Pwd, null, null);
        }
        // EventHandler of GetTreeOrders
        void _WSClient_GetTreeOrdersCompleted(object sender, GetTreeOrdersCompletedEventArgs e)
        {
            //TextBlock1.Text = e.Result;
        }

        // GetRestGoods()
        private void WSGetRestGoods(string User, string Pwd)
        {
            _WSClient.GetRestGoodsAsync(User, Pwd, false);
        }
        // EventHandler of GetRestGoods
        void _WSClient_GetRestGoodsCompleted(object sender, GetRestGoodsCompletedEventArgs e)
        {
            //TextBlock1.Text = e.Result;
        }


        private void btnUpdate_Click(object sender, EventArgs e)
        {
            switch (pPanel.SelectedIndex)
            {
                case 0:
                    {
                        WSGetClientInfo(User, Pwd);
                        break;
                    }
                case 1:
                    {
                        WSGetRestGoods(User, Pwd);
                        break;
                    }
                case 2:
                    {
                        WSGetTreeOrders(User, Pwd);
                        break;
                    }
            }
        }

        private void pPanel_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void miSettings_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/SettingsPage.xaml", UriKind.Relative));
        }

    }
}
28 Serginio1
 
19.12.13
12:36
(25) В смысле Клиента WCF из декстопного приложения.
Сначала лучше сделать на декстопном приложении отладить, а затем уж приступать к мобильному.
(26) Если открывает wsdl то он проходит авторизацию.
Единственно помню через браузер не подключалось если Юзер пароль были на кирилице.
Ну и соответсвенно нужно смотреть какая авторизация на сервере 1С была на уровне Аутентификация 1С:Предприятия

v8: web сервис авторизация 8.2
29 ditron
 
19.12.13
12:49
В том то и дело что SDK отличается десктоп и WP (надо ставить у меня VS Express for WP), в WP многого нет, все что нашел (статьи, форумы) все для десктопа, практически, я даже уверен что если напишу будет работать, жалко время тратить. Вот у Калиновского то что надо, но блин службы не 1С-ные. Сейчас полажу еще в настройках IIS.
Если что-то будет получатся обязательно отпишусь, я думаю тема многим будет интересна, сейчас мобильные приложения наберут большие обороты, кстати а вот тот-же клиент писал под андроид (правда там платформа встроена, там просто все конфигурацию написал, скомпилил, и на тебе) - работает же сволочь )
30 Serginio1
 
19.12.13
12:59
(29) Но ты сможешь посмотреть настройки в Конфиге и сравнить с мобильными. Просто у меня есть опыт работы с мобильными приложениями и проще олаживать на декстопном приложении, а затем переносить на мобильное. Кроме того еще есть фидлер и смотреть разницу в сообщениях
31 Serginio1
 
19.12.13
13:24
Кстати задай вопрос здесь http://www.rsdn.ru/
Там намного больше народу занимающихся C# для мобильных приложений
32 ditron
 
19.12.13
15:26
Что такое фидлер?
33 Serginio1
 
19.12.13
15:30
34 Serginio1
 
19.12.13
15:47
Кстати иногда сообщения от сервера приходят не в стандарте SOAP. В этом случае ClientBase выдает муру типа (8) в SoapHttpClientProtocol выдает нормально пришедшее сообщение.
Фидлер показывает реальное отправленное и пришедшее сообщение
35 ditron
 
19.12.13
16:05
ААААА
Включил автологин (28), конектится, данные приходят!!!
36 ditron
 
19.12.13
16:05
Значит все таки в аутентификации дело... роем дальше
37 Serginio1
 
19.12.13
16:48
Кстати а на VS Express for WP есть пункт Edit WCF Configuration?
38 ditron
 
19.12.13
17:13
это в контекстном меню проекта?
я редактирую ServiceReferences.ClientConfig он в проекте присутствует
39 ditron
 
19.12.13
17:18
и еще у меня VS руссифицированный офиц. релиз )
40 Serginio1
 
19.12.13
17:47
Сейчас подключился к известному мне сервису на 1С там нужно как в 24
либо поправить конфиг

<binding name="ИмяТвоегоБиндинга">
                    <security mode="TransportCredentialOnly">
                        <transport clientCredentialType="Basic" />
                    </security>
                </binding>

Но удобне это делать через Microsoft® Service Configuration Editor который вызывается в контекстном меню по клику правой копкой на app.config

Но у тебя другая ошибка
41 Serginio1
 
19.12.13
17:49
Но в 1С кстати 2 точки подключения. Видно WP не поддерживает Soap12
42 Serginio1
 
19.12.13
18:51
43 ditron
 
19.12.13
19:38
Да не поддерживает, я это с самого начала знал. Я же говорю тут проблема в авторизации, сейчас стоит автологин в vrd файле прописал ручками, и данные ходят. Админы дали доступ к консоли ИИС, там оказывается Basic Authentication выключен
44 Serginio1
 
20.12.13
10:53
Посмотри снифером что тебе сервер выдает
http://forum.ixbt.com/topic.cgi?id=24:31698:51#51
Ошибка? Это не ошибка, это системная функция.