Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы, WCF
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
1 / 1 / 5
Регистрация: 30.05.2016
Сообщений: 14
.NET 4.x

Передать Soap header в готовый web service

30.05.2016, 13:06. Показов 4872. Ответов 3

Студворк — интернет-сервис помощи студентам
Делаю первые шаги в программировании c#, Visual Studio. Решил изучить в процессе решения определенных задач. У меня есть следующая задача:
написать приложение, которое подключалось бы к сайту системы и с помощью Web Service "SessionService" получило ID сессии и отключилось. Описание по web service, к которому необходимо подключиться, можно получить по этому адресу "https://92.46.122.150:8443/esf-web/ws/SessionService?wsdl".

Для этих целей я решил использовать Visual Studio и С#, .Net 4 (или 4.5), Microsoft.Web.Services3.dll, Windows 8.1.

Создал проект «Windows Form Application», создал Web Reference «https://esf.gov.kz:8443/esf-we... vice?wsdl».
В коде пытаюсь сделать следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SessionService WS = new SessionService();
СreateSessionRequest CreateReq = new CreateSessionRequest();
 
string strPasswordCertificate = "123456";
string strCertificate = "C:/Test/AUTH_RSA_db79bb07b4722c042e025979b3b11995fc46765b.p12";
X509Certificate x509_CertAUTH = new X509Certificate(strCertificateFilePathAUTH, strPasswordCertificate);
string strCertAUTH = x509_CertAUTH.ToString();
 
CreateReq.x509Certificate = strCertAUTH;
 
string strIIN = "123456789021";
 
CreateReq.tin = strIIN;
WS.createSession(CreateReq);
Но при выполнении этого кода, Visual Studio ругается на строке с "WS.createSession(CreateReq);" и выдает следующее сообщение:
SoapHeaderException was unhandled.
An unhandled exception of type "System.Web.Service.Protocols.SoapHeader Exeption" occurred in System.Web.Services.dll
Additional information: An error was discovered processing the <wsse:Security> header.

Как я понял такое исключение возникает когда метод веб-службы XML вызывается посредством SOAP и происходит исключение во время обработки заголовка SOAP. Внес изменения в свой код и сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SessionService WS = new SessionService();
СreateSessionRequest CreateReq = new CreateSessionRequest();
 
string strPasswordCertificate = "123456";
string strCertificate = "C:/Test/AUTH_RSA_db79bb07b4722c042e025979b3b11995fc46765b.p12";
X509Certificate x509_CertAUTH = new X509Certificate(strCertificateFilePathAUTH, strPasswordCertificate);
string strCertAUTH = x509_CertAUTH.ToString();
 
CreateReq.x509Certificate = strCertAUTH;
 
string strIIN = "123456789021";
 
CreateReq.tin = strIIN;
 
string _userName = "123456789011";
string _UserPassword = "TestPass123"
 
UsernameToken userToken;
userToken = new UsernameToken(_userName, _UserPassword, PasswordOption.SendPlainText);
 
SoapContext requestContext = WS.RequestSoapContext;
requestContext.Security.Tokens.Add(userToken);
 
WS.createSession(CreateReq);
Но при выполнении этого кода, Visual Studio ругается на строке с "WS.createSession(CreateReq);" и выдает следующее сообщение:
SoapHeaderException was unhandled.
An unhandled exception of type 'System.Web.Service.Protocols.SoapHeader Exeption' occurred in System.Web.Services.dll
Additional information: An invalid security token was provided.

Не могу понять:
1. Что не так делаю?
2. Что необходимо добавить или исправить, чтобы можно было подключиться к сервису и получить id сессии? Есть какие-нибудь идеи?
Сертификаты тестовые рабочие, с помощью них через браузер захожу без проблем на сайт системы и могу работать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2016, 13:06
Ответы с готовыми решениями:

SOAP web-service
Всем привет! Возникла такая проблема: нужно написать SOAP веб-сервис с одним методом: SRI Входные параметры: CId – string SD...

SOAP Web Service Server
Добрый день. Я создала веб-сервис по инструкции в IDE Eclipse EE, использовала axis2,tomcat7. Как на сервере получить полный запрос...

Принципы реализации SOAP web service
Итак. Я должен реализовать SOAP web service на c++. Сервис должен хоститься на Apache Axis2/C, использовать ODBC/OLE DB. В общем я пока не...

3
1 / 1 / 5
Регистрация: 30.05.2016
Сообщений: 14
27.07.2016, 08:00  [ТС]
Решение найдено и заключается в ниже следующем.
Во первых, нужно добавить web-сервис "https://92.46.122.150:8443/esf-web/ws/SessionService?wsdl" как Service Reference.
Во вторых, сертификат добавленного web-сервиса должен быть доверенным (проверенным сертификатом). Если нет, то это можно сделать с помощью кода ниже:
C#
1
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
В третьих, в наш проект необходимо добавить новый объект C# class для нашего нового SOAP заголовка. В этом классе должен быть код, который приведен ниже:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
namespace WindowsFormsApplication1
{
    public class MySoapSecurityHeader : MessageHeader
    {
        private readonly UsernameToken _usernameToken;
 
        public MySoapSecurityHeader(string username, string password)
        {
            _usernameToken = new UsernameToken(string.Empty, username, password);
        }
 
        public MySoapSecurityHeader(string id, string username, string password)
        {
            _usernameToken = new UsernameToken(id, username, password);
        }
 
        public override string Name
        {
            get { return "Security"; }
        }
 
        public override string Namespace
        {
            get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
        }
 
        protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UsernameToken));
            serializer.Serialize(writer, _usernameToken);
        }
    }
 
 
    [XmlRoot(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
    public class UsernameToken
    {
        public UsernameToken()
        {
        }
 
        public UsernameToken(string id, string username, string password)
        {
            Id = id;
            Username = username;
            Password = new Password() { Value = password };
        }
 
        [XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
        public string Id { get; set; }
 
        [XmlElement]
        public string Username { get; set; }
 
        [XmlElement]
        public Password Password { get; set; }
    }
 
    public class Password
    {
        public Password()
        {
            Type = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText";
        }
 
        [XmlAttribute]
        public string Type { get; set; }
 
        [XmlText]
        public string Value { get; set; }
    }
}
После этого в основной файл "Form1.cs" необходимо будет добавить такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//The path to the certificate.
string certPath = "C:/AUTH_RSA256_e9f5afab50193175883774ec07bac05cb8c9e2d7.p12";
 
//Password to signing a certificate
string certPassword = "123456";
 
//IIN or BIN persom who signing ESF on esf_gov site
var tin = "123456789021";
 
//Load the certificate into an X509Certificate object.
X509Certificate x509Cert = new X509Certificate(certPath, certPassword);
 
//Transfer sertificate to string value of base64
var certPEM = ExportToPEM(x509Cert);
 
 
using (SessionServiceClient client = new SessionServiceClient())
            {
                using (new OperationContextScope(client.InnerChannel))
                {
                    OperationContext.Current.OutgoingMessageHeaders.Add(
                        new MySoapSecurityHeader("123456789011", "TestPass123"));
 
                    //Create session for a work with site ESF
                    CreateSessionRequest createSessionRequest = new CreateSessionRequest
                    {
                        tin = tin,
                        x509Certificate = certPEM
                    };
 
                    var response = client.createSession(createSessionRequest);
                    MessageBox.Show("Session ID is: " + response.sessionId, "Information message",
                                    MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
 
                    //Close session for a work with site ESF
                    CloseSessionRequest closeSessionRequest = new CloseSessionRequest
                    {
                        sessionId = response.sessionId,
                        tin = tin,
                        x509Certificate = certPEM
                    };
 
                    var closeResponse = client.closeSession(closeSessionRequest);
                }
            }
 
        }
        public static string ExportToPEM(X509Certificate cert)
        {
            //Export certificate, get baty array, convert in base64 string
            return Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks);
        }
Затем можно запускать программу.
0
0 / 0 / 0
Регистрация: 30.01.2017
Сообщений: 1
30.01.2017, 07:17
Почему в первом случае пока выдавало ошибку ты использовал SessionService client = new SessionService()
А после добавления класса ты стал использовать с добавлением клиент а на сервисе такого класса нет SessionServiceClient client = new SessionServiceClient() можешь пояснить. попробовал собрать проект подобный он не работает а если убрать клиент ругается на client.InnerChannel. "TestNotary.WebReference.IDBankUnifoServ ice" не содержит определения для "InnerChannel" и не был найден метод расширения "InnerChannel", принимающий тип "TestNotary.WebReference.IDBankUnifoServ ice" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). Был бы рад объяснению.
0
1 / 1 / 5
Регистрация: 30.05.2016
Сообщений: 14
31.01.2017, 11:33  [ТС]
Почему в первом случае пока выдавало ошибку ты использовал SessionService client = new SessionService()
А после добавления класса ты стал использовать с добавлением клиент а на сервисе такого класса нет SessionServiceClient client = new SessionServiceClient()
Для того, чтобы в уходящее сообщение на удаленный сервис можно было добавить свой SOAP-header.

Чтобы заработало, вам нужно в свой проект добавить следующее:
1. web-сервис "https://92.46.122.150:8443/esf-web/ws/SessionService?wsdl" как Service Reference.
2. Убедиться, что в начале основного файла "Form1.cs" есть следующее:
using WindowsFormsApplication1.ESF_CreateClose Session;
где ESF_CreateCloseSession - это название добавленного web-сервиса, которое указали в поле Namespace в момент создания web-сервиса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2017, 11:33
Помогаю со студенческими работами здесь

Web service защита soap сообщений
Добрый день уважаемые форумчани. Столкнулся со следующей проблемой. Есть web server написан на java который выполняет на своей стороне...

SOAP service deployment in GlassFish
Хочу разобраться с SOAP сервисами, для этого использую пример из книги по GlassFish: Есть сервис import javax.jws.WebMethod; ...

Как отправить готовый файл SOAP запроса?
Доброго времени суток. Имеется определённое количество файлов request_*.soap, содержащие уже готовые SOAP запросы. Возможно ли как-то на...

Отправка и получение WCF Service Soap
Приветствую всех! Сразу скажу - никогда не работал с WCF и SOAP. Поступила задача сделать следующее: сделать WCF Service работающий по...

Web приложение, web-service
Люди умные, добрые. Срочно нужна помощь. В общем, представьте , что вам надо по курсовой разработать web-сервис. Я по глупости думал, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru