Проблемы с подключением к WSDL - PullRequest
2 голосов
/ 01 сентября 2011

Мне дали SDK, который использует файл WSDL для подключения к веб-службе.Мне дали пример кода в README вместе с пошаговыми инструкциями о том, как настроить файл, но даже после выполнения всего кода код не скомпилируется.

Инструкции и код здесь.http://dl.dropbox.com/u/3425987/README.txt

Файл WSDL находится здесь http://dl.dropbox.com/u/3425987/arm-inlined.wsdl

Кажется, он не находит ArmServiceImplService.

Любая помощь в том, что я делаю неправильно, очень ценится.

Редактировать: Единственное, что я делаю, не следуя инструкциям, это то, что я использую VS 2010, а не 2008. Я не думаю, что это будет проблемой, но у меня заканчиваются другиеварианты.

Ответы [ 5 ]

1 голос
/ 18 октября 2011

Последний кусок головоломки для вас.Я вернулся к своей электронной почте, чтобы увидеть, что именно было в 7/8 в инструкциях, и это то, что я сообщил HUD:

В инструкциях, которые вы предоставляете для Visual Studio 2008, пункт 8 говорит вамдобавить сервисную ссылку.Теперь часть из этого я понял правильно, а часть - нет, потому что я слишком новичок в .net, но вам нужно настроить эту строку так, чтобы она добавляла новую веб-ссылку (ссылка на службу больше не нужна) вместосервисный справочник, и очень важно сказать им, чтобы он назвал его ARM

Это также относится и к VS2010, который мне удалось заставить работать вчера вечером.И, чтобы вы знали, я отредактировал исходный пост кода, чтобы удалить разрывные строки, поэтому просто внесите изменения в идентификаторы и пути, и вы должны быть готовы.Я запустил его против URL-адреса разработчика, который я получил от поддержки hud (Андрей), а не пытался запустить службу на моей машине.Я предлагаю вам сделать то же самое, потому что, если их образцы настолько устарели, то я бы поспорил, что сервис, который они предоставляют в качестве образца, тоже.URL-адрес разработчика работал довольно хорошо, хотя я тоже нашел там несколько несоответствий.С тех пор они были исправлены, так что это должно быть лучшее место для проверки ваших отправляемых файлов XML.

1 голос
/ 01 сентября 2011

Как часть WSDL существует местоположение / URL для доступа к службе SOAP - согласно WSDL это:

http://localhost:8080/ARM/ARM/

Это расположение приведет к тому, что ваш клиент попытается получить доступ к порту 8080 в системе, на которой он работает ... если у вас не работает служба SOAP, это не будет работать (соединение отказано и / илитаймаут) ...

Из исходного кода в вашем README:

// TODO: Replace with live server URL when ready
armService.Url = "http://localhost:8081/ARM/ARM/";

Этот комментарий говорит вам о замене URL на URL действующего сервера ...

Исходя из вашего вопроса, я предполагаю, что вы не заменили URL / у вас нетURL действующего сервера?

РЕДАКТИРОВАТЬ - в соответствии с комментарием OP:

Если ваш код не компилируется, вы, кажется, пропустили пункт 7 и следуйте инструкциям в README

7) После того, как Visual Studio откроет вновь созданный проект, щелкните правой кнопкой мышина SampleArmClient в обозревателе решений и выберите «Добавить ссылку на службу»

8) В диалоговом окне «Добавить ссылку на службу» в поле с меткой URL введите: a) URL-адрес WSDL из действительного илиСлужба «mock» ARM (Инструкции по запуску службы «mock» ARM см. в разделе 7.) Например, если служба «mock» была запущена на порту 8081, URL-адрес службы будет http://localhost:8081/ARM/ARM?WSDL.Please обратите внимание, что URL, который будет использоваться в вашем коде: http://:/ARM/ARM. Он не содержит "? WSDL" - этот суффикс предназначен исключительно для обнаружения веб-службы.б) Местоположение на диске, в котором находится wsdl в распакованном дистрибутиве.Например, если дистрибутив был распакован в каталог c: / temp, URL-адрес будет иметь вид c: \ temp \ arm \ src \ main \ resources \ gov \ hud \ arm \ wsdl \ arm-inlined.wsdl.(Это версия WSDL со схемой, включенной в нее, чтобы .NET мог разрешать ссылки без внешней схемы.)

0 голосов
/ 25 ноября 2012

Я просто думал, что увижу это. Вышеупомянутое решение работало для всех, кроме больших файлов, которые мне нужно было передать. Чтобы исправить это, я просто удалил (вырезал) защищенный оператор переопределения со страницы program.cs, скопировал его на страницу reference.cs и сделал всего две корректировки. Новое утверждение:

protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
            if (PreAuthenticate)
            {
                NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
                if (networkCredentials != null)
                {
                    byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
                    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
                }
                else
                {
                    throw new ApplicationException("No network credentials");
                }
            }
            request.KeepAlive = false;
            return request;
        }

После сохранения я смог оставаться на связи достаточно долго для передачи действительно больших файлов.

0 голосов
/ 17 октября 2011

Что ж, чудеса никогда не исчезнут. Я только что сделал еще один снимок кода ниже. Конечно, это дало мне ошибку здесь:

    api client = new api(); 
    client.PreAuthenticate = true; 
    client.Credentials = new NetworkCredential(credentials.UserName, credentials.Password); 

Так что я удалил его и перезапустил, и получил ответ от HUD. Как насчет этого!! Он только отправляет файл агентства, но он подключился, отправил файл и получил ответ мне. Теперь все, что мне нужно сделать, это создать другие функции, которые мне нужны, и способ передать ему учетные данные для каждой компании и как вернуть ответы, чтобы я мог зарегистрировать их на своем сайте asp, и все будет хорошо в мире снова. Файл bin показывает, что он создает исполняемый файл, так что я надеюсь, что я могу вызвать его из своего asp-кода, отправив ему учетные данные и путь к файлам для каждой компании, и он может отправлять их по одному, получать ответ и регистрировать его. Затем выполните ответы позже, чтобы убедиться, что все данные прошли проверку.

Еще много работы, но это большой шаг вперед. Надеюсь, это поможет, и дайте мне знать, если вы победите меня. Я - подрядчик, и мне может никогда не заплатить за выполнение этой части проекта, но приятно знать, что теперь я могу пойти по этому пути. Я могу просто сделать это, чтобы удовлетворить мою потребность побить машину. :) Но если вы победите меня, пожалуйста, пришлите мне финал, и я гарантирую, что HUD получит полное обновление, чтобы никто другой не бил их головой об стену.

0 голосов
/ 17 октября 2011

Прежде всего, у меня та же проблема, поэтому у меня пока нет ответов на все вопросы. Но используя VS2010, вам нужно добавить код для установления соединения. Проблема в том, что вы должны проходить аутентификацию в заголовке, а с VS2008 и выше он этого не делает.

Теперь есть и другие проблемы. Если вы хотите запустить пакет данных 4, то есть. Код, который они нам дают, предназначен для более раннего пакета данных и не запускает функции отправки / получения пакета данных 4, потому что он не включает их примеры. Я просил, чтобы они включили это, но кто знает, сколько времени это займет.

Кроме того, как отмечено выше, шаг 7/8 имеет решающее значение, а указания неверны. Я также уведомил службу поддержки об этом, но на момент моей последней проверки они не обновили примечания, чтобы включить это. Извините, я не помню специфику прямо сейчас, но это было что-то очень простое, что я поймал, просто читая экраны, когда делал это в третий или четвертый раз.

Как вы заметите с помощью приведенного ниже кода, я добился определенного прогресса в правильном направлении, но я не являюсь разработчиком .net. Я классический аспирант, так что я до сих пор не могу полностью настроить его таким образом и использовать инструмент SOAP UI для наших загрузок в настоящее время. Это означает, что я должен сделать все 30 компаний вручную, по одному файлу за раз. 4 файла каждый. Тем не менее, я закончил через день и хорошо заплатил за свое время, так что все в порядке, но я разочарован поддержкой, которую я получил до сих пор, поэтому, если вы узнаете больше из этого, пожалуйста, дайте мне знать.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using ARMService.ARM;
    using System.Net;
    using System.IO;
    using System.Threading;

    namespace ARMService
    {
      public partial class api : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
    //added "protected overide" to get past the pre-auth issue with VS2008 and above since I'm  running VS2010
    //Now this is in place, you will send the authentication header at the first request. 
    //Since this implementation is using the credentials from the WebClientProtocol, you will be required to set these in advance. 
    //But I guess you were doing that anyways. Furthermore, I chose to only do the pre-authentication if the PreAuthenticate 
    //property was set to true. (deactivated if statement so it will always preauth.)
    //So if you want to consume this service, this is how you would initiate it;
    //api client = new api();
    //client.PreAuthenticate = true;
    //client.Credentials = new NetworkCredential("username", "password");

    protected override System.Net.WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
        //              if (PreAuthenticate)    //removed if statement because I want all items to pre-auth
        //              {
        NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
        if (networkCredentials != null)
        {
            byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
            request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
        }
        else
        {
            throw new ApplicationException("No network credentials");
        }
        //              }
        return request;
    }
}


class Program
{
    static void Main(string[] args)
    {
        ArmServiceImplService armService = new ArmServiceImplService();
        // TODO: Replace with live server URL when ready
        armService.Url = "https://HUD will give you the url/ARM/ARM/";
        armService.PreAuthenticate = true;
        NetworkCredential credentials = new NetworkCredential();
        // TODO: Replace with userid/password issued by HUD for HCS system when ready
        credentials.UserName = "yourHUDMXnumber";
        credentials.Password = "yourpassword";

        armService.Credentials = credentials;

        //These three removed per second post and fixed the last issue
        //api client = new api();
        //client.PreAuthenticate = true;
        //client.Credentials = new NetworkCredential(credentials.UserName, credentials.Password);

        //removed for now to try only postAgencyData
        //doPing(armService);
        //doGetReference(armService);
        //postSubmissionResponse submissionId = doPostSubmission(armService);

        //fixed
        postSubmissionResponse psr = AgencyData(armService);
        while (dopostAgencyDataResponse(armService, psr) != true)
        {
            // sleep for 60 seconds before checking agin.
            Thread.Sleep(60000);
        }
    }

    private static void doGetReference(ArmServiceImplService armService)
    {
        getReference getReference = new getReference();
        // TODO: Replace 80000 with your agency HCS id.
        getReference.agcHcsId = 80000;
        getReference.referenceId = 0;
        referenceItem[] referenceItems = armService.getReference(getReference);
        foreach (referenceItem referenceItem in referenceItems)
        {
            Console.WriteLine(referenceItem.id);
            Console.WriteLine(referenceItem.name);
            Console.WriteLine(referenceItem.longDesc);
            Console.WriteLine(referenceItem.shortDesc);
        }
    }

    private static void doPing(ArmServiceImplService armService)
    {
        ping pingIn = new ping();
        // TODO: Replace 80000 with your agency HCS id.
        pingIn.agcHcsId = 80000;
        string pingString = armService.ping(pingIn);
        Console.WriteLine(pingString);
    }




    private static postSubmissionResponse AgencyData(ArmServiceImplService armService)
    {
        postAgencyData AgencyData = new postAgencyData();
        submissionHeader40 header = new submissionHeader40();
        // TODO: Replace 80000 with your agency HCS id.
        header.agcHcsId = 80000;
        header.agcName = "Your Agency Name";
        // TODO: Replace 8 with your CMS vendor id issued to you by ARM Development Team.
        header.fiscalYearId = 17;
        header.reportingPeriodId = 3;
        header.cmsVendorId = yourVendorNUmber;
        AgencyData.submissionHeader40 = header;

        // TODO: Replace fake databag with valid databag of your own
        FileStream file = new FileStream("c:/Users/Public/Documents/AgencyProfileData.xml", FileMode.Open, FileAccess.Read);
        StreamReader sr = new StreamReader(file);
        string str = sr.ReadToEnd();

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        AgencyData.submissionData = encoding.GetBytes(str);

        //fixed
        postSubmissionResponse psr = armService.postAgencyData(AgencyData);
        Console.WriteLine("Submitted Data returned id : " + psr.submissionId);
        return psr;
    }

    private static Boolean dopostAgencyDataResponse(ArmServiceImplService armService,
        postSubmissionResponse postAgencyDataResponse)
    {
        getSubmissionInfo getSubmissionInfo = new getSubmissionInfo();
        // TODO: Replace 80000 with your agency HCS id.
        getSubmissionInfo.agcHcsId = 80000;
        getSubmissionInfo.submissionId = postAgencyDataResponse.submissionId;
        getSubmissionInfoResponse response = armService.getSubmissionInfo(getSubmissionInfo);
        Console.WriteLine("SubmissionInfo Status Date = " + response.statusDate);
        Console.WriteLine("SubmissionInfo Status Message = " + response.statusMessage);
        // if Done or Error returned, then return true to stop polling server.
        if (response.statusMessage.Equals("DONE") || response.statusMessage.Contains("ERROR"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...