powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Работа с внешним WSDL сервисом HTTP Basic Authenticate 401-Unauthorize
2 сообщений из 2, страница 1 из 1
Работа с внешним WSDL сервисом HTTP Basic Authenticate 401-Unauthorize
    #39953733
arik_aug1970
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем хорошего времени суток.
Делаю asp.net web api 2 сервис, который обращается во внешний WSDL сервис. Удаленный сервис
обладает "протухшим" сертификатом SSL.
В связи с этим, чтобы запустить метод удаленого WSDL сервиса, необходимо сделать следующие шаги:
1. Обойти SSL(их сертификат, который, как мне сказали знающие люди,
может быть "протухшим"). - по примерам из инета сделал.
2. Дать запрос на HTTP Basic Authentication - по примерам из инета сделал.
3. Ну и осуществить запуск самого метода из сервиса на сработку -
вот тут получился затык. При пошаговой трассировке, как только я
запускаю его(метод сервиса) возвращается ошибка :
Удаленный сервер возвратил ошибку: (401) Несанкционированный.
Запрос HTTP не разрешен для схемы аутентификации клиента "Anonymous".
Я вроде как догадываюсь, что вызов метода порождает новую сессию,
отличную от HTTP Basic Authentication, но никак не могу сообразить,
как это HTTP Basic Authentication и вызов метода объединить в одну сессию.
Или может проблема вообще не в сессии.
Прошу помощи и заранее спасибо

Ниже я привожу свой метод и выделил то место, где проблема:

Код: 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.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
public IHttpActionResult NewCustomer_MCard_JSON([FromBody]NewCustomer_MCard_OUT value)
{
 string doc_JSON = "";
 try
 {
    /* Создаем клиента на ресурс  - сервис OFB по имени Issuing */
    using (var client = new IssuingPortClient("Issuing"))
    {
       /* Заполняем данными класс создания нового клиента */
        RowType_Customer new_customer = new RowType_Customer();

        new_customer.SURNAME = value.SURNAME;
        new_customer.F_NAMES = value.F_NAMES;
        new_customer.CL_TYPE = value.CL_TYPE;
        new_customer.RESIDENT = value.RESIDENT;
        new_customer.STATUS = value.STATUS;
        new_customer.B_DATE = value.B_DATE;
        new_customer.DOC_TYPE = value.DOC_TYPE;
        new_customer.SERIAL_NO = value.SERIAL_NO;
        new_customer.SEX = value.SEX;

        /* Заполняем константами код банка и код группы -  класс OperationConnectionInfo */
        OperationConnectionInfo conInfo = new OperationConnectionInfo();

        conInfo.BANK_C = WebConfigurationManager.AppSettings["BANK_C"];
        conInfo.GROUPC = WebConfigurationManager.AppSettings["GROUPC"];

        /* Для сработк метода создания нового клиента необходим этот третий параметр */
        ListType_CustomerCustomInfo list_new_cust = new ListType_CustomerCustomInfo();

        /* Инициализируем класс информация об ответе */
        OperationResponseInfo resp_customer = null;

     try
     {
            [color=red]/* Обходим SSL */[/color]
   ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
   HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(WebConfigurationManager.AppSettings["SERV_URL"]);

   [color=red]/* Делаем аутентификацию по Basic HTTP Authentication */[/color]
   string userName = WebConfigurationManager.AppSettings["USER_NAME"];
   string password = WebConfigurationManager.AppSettings["PASSWORD"];
   var byteArray = Encoding.ASCII.GetBytes($"{userName}:{password}");
   string basic_param = Convert.ToBase64String(byteArray);
   webRequest.Method = "GET";
   webRequest.Headers["Authorization"] = "Basic " + basic_param;
   webRequest.PreAuthenticate = true;
   CookieContainer myExternalServerCookies = new CookieContainer();
   webRequest.CookieContainer = myExternalServerCookies;

   HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
   Stream receiveStream = response.GetResponseStream();
   StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
   String code = readStream.ReadToEnd();

  [color=red] /* Запускаем сработку получения информации о новом клиенте */[/color]
   resp_customer = client.newCustomer(conInfo, ref new_customer, ref list_new_cust);

   /* Если ответный код соответствует 0 или 1  -  */
   if (resp_customer.response_code == "0" || resp_customer.response_code == "1")
    {
       /* - сериализуем JSON из RowType_Customer класса */
       doc_JSON = JsonConvert.SerializeObject(new_customer);

       CLog.Write(@"OK - MCard-CREATE_NEW_CUSTOMER(Ответ клиенту) - 
                 Пользователь успешно создан.Возвратный JSON - " + doc_JSON);
    }
      else
        {
          CLog.Write("Error - MCard-CREATE_NEW_CUSTOMER - " + resp_customer.response_code + " : " +                       resp_customer.error_description);
        }
        response.Close();
        readStream.Close();
        CLog.Write(code);
   }
    catch (Exception ex)
    {
      CLog.Write(ex.ToString());
    }

  }
   /* Возвращаем сам JSON */
    return Ok(doc_JSON);
 }
   catch (Exception ex)
 {
   CLog.Write("Error - MCard-CREATE_NEW_CUSTOMER - " + ex.ToString());
   return BadRequest("Error - MCard-CREATE_NEW_CUSTOMER - " + ex.ToString());
 }
}


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Работа с внешним WSDL сервисом HTTP Basic Authenticate 401-Unauthorize
    #39956335
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сгенерить клиента по их WSDL никак? Я делал когда-то подобную штуку - именно пользуясь автосгенеренными классами. Вся работа велась через класс-враппер, который выглядел как-то так:
Код: 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.
class WcfClientWrapper: IDisposable
{
  public RemoteServiceClient Client { get; }
  readonly OperationContextScope _scope;
  public WcfClientWrapper()
  {
    Client = new RemoteServiceClient("<endpointName>");
    if (Client.ClientCredentials==null)
      throw new ApplicationException("Client.ClientCredentials==null");
    ServicePointManager.Expect100Continue = false; 
    Client.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; // for proxy
    Client.ClientCredentials.UserName.UserName = "username";
    Client.ClientCredentials.UserName.Password = "password";
    _scope = new OperationContextScope(Client.InnerChannel);
    var httpRequestProperty = new HttpRequestMessageProperty();
    httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " +
      Convert.ToBase64String(
        Encoding.ASCII.GetBytes(
          Client.ClientCredentials.UserName.UserName + ":" +
          Client.ClientCredentials.UserName.Password
        )
    );
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
  }

  public void Dispose()
  {
    if (Client == null) return;
    _scope.Dispose();
    if (Client.State == CommunicationState.Faulted)
      Client.Abort();
    else
      Client.Close();
  }
}


и далее
Код: c#
1.
2.
3.
4.
5.
using (var w = new WcfClientWrapper())
{
  var someResponse = w.Client.DoSomeOperation(someParameter);
  ......
}


- насколько я помню из какого-то обсуждения на SoF, в данном случае существенно важным было хранить ссылку на OperationContextScope внутри враппера клиента на всём протяжении работы с ним.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Работа с внешним WSDL сервисом HTTP Basic Authenticate 401-Unauthorize
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (11): Анонимы (7), Bing Bot 1 мин., Yandex Bot 1 мин., CerebroSQL 6 мин., Google Bot 8 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]