Использование USCG API обмена информацией о состоянии порта - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь заставить работать API обмена информацией о состоянии порта USCG, и пока мне не везет. Я также могу найти почти нулевую информацию об услуге онлайн.

Есть главная страница USCG:

https://cgmix.uscg.mil/XML/Default.aspx

И ASMX / WSDL:

https://cgmix.uscg.mil/xml/PSIXData.asmx

https://cgmix.uscg.mil/xml/PSIXData.asmx?WSDL

Я пытаюсь использовать метод getVesselSummary. API выглядит достаточно просто для использования, но пока я могу получить только пустой ответ. Поэтому на данный момент я задаюсь вопросом, требует ли она какой-либо аутентификации, хотя я не видел упоминаний об этом в Интернете.

Я добавил их WSDL в Visual Studio в качестве веб-ссылки, и классы прокси были построены нормально.

Я пробовал заполнить некоторые параметры, только один из параметров. Результат всегда одинаков (скриншот ниже):

var vs = new uscg.psix.PSIXData();
var data = vs.getVesselSummary("650617", "CITY OF CHICAGO", "WDC2646", "", "", "UNITED STATES", "", "1982");

enter image description here

Я знаю, что этот корабль существует, потому что я могу найти его по тем же критериям поиска, используя их онлайн-интерфейс:

enter image description here

enter image description here

Редактировать

Очевидно, проблема заключается в SOAP / XML, создаваемом клиентом Web Studio для Visual Studio. Когда я подключаюсь к сервису с помощью Soap UI и создаю запрос, он возвращает данные.

Итак, теперь вопрос в том, как заставить Visual Studio / C # вернуть разметку, которая нравится этой службе?

Это работает (Soap UI)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cgm="http://cgmix.uscg.mil">
   <soapenv:Header/>
   <soapenv:Body>
      <cgm:getVesselSummary>
         <cgm:VesselID>650617</cgm:VesselID>
         <cgm:VesselName></cgm:VesselName>
         <cgm:CallSign></cgm:CallSign>
         <cgm:VIN></cgm:VIN>
         <cgm:HIN></cgm:HIN>
         <cgm:Flag></cgm:Flag>
         <cgm:Service></cgm:Service>
         <cgm:BuildYear></cgm:BuildYear>
      </cgm:getVesselSummary>
   </soapenv:Body>
</soapenv:Envelope>

Это НЕ работает - запрос Visual Studio

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <getVesselSummary xmlns="http://cgmix.uscg.mil">
      <VesselID>650617</VesselID>
      <VesselName>
      </VesselName>
      <CallSign>
      </CallSign>
      <VIN>
      </VIN>
      <HIN>
      </HIN>
      <Flag>
      </Flag>
      <Service>
      </Service>
      <BuildYear>
      </BuildYear>
    </getVesselSummary>
  </soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 09 апреля 2019

Хорошо, значит, проблема была двоякой.

Один: Несмотря на то, что я ввел адрес WSDL в диалог добавления веб-ссылки, используя https, Visual Studio в своей бесконечной мудрости решила сохранить его с http.

Два: на сайте Береговой охраны есть какая-то ошибка сертификата.Поэтому мне нужно было добавить обработчик для System.Net.ServicePointManager.ServerCertificateValidationCallback, чтобы игнорировать это.

Полный код моей тестовой страницы, которую я выкладываю сюда, чтобы я мог двигаться дальше.Не забудьте использовать операторы!:

using System;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Web.UI;

namespace CGIX_2
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;

            try
            {
                var sr = new mil.uscg.psix.PSIXData();
                var data = sr.getVesselSummaryXMLString("", "A STEVE CROWLEY", "", "", "", "", "", "");
            }
            catch (Exception ex)
            {

            }
        }
        static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
        {
            // Ignore errors
            return true;
        }
    }

}
...