Отправка SOAP-конверта в веб-службу MS Dynamics NAV

Я пытаюсь отправить конверт SOAP непосредственно в веб-службы Dynamics NAV с помощью HttpWebRequest, HttpWebResponse.

Код:

        private void button1_Click(object sender, EventArgs e)
    {
        string requestString = LoadData();
        HttpWebRequest request;
        HttpWebResponse response = null;
        string url = "http://localhost:7047/DynamicsNAV70/WS/Page/nav_Item";
        byte[] requestBuffer = null;
        Stream postStream = null;
        Stream responseStream = null;
        StreamReader responseReader = null;
        request = (HttpWebRequest)WebRequest.Create(url);
        request.ProtocolVersion = new Version(1,1);
        request.Method = "POST";

        //request.Headers.Add("SOAPAction", @"urn:microsoft-dynamics-schemas/page/nav_item:create");
        request.Headers.Add("Action", @"urn:microsoft-dynamics-schemas/page/nav_item");
        //request.Headers.Add("Content-Type", @"text/xml; charset=utf-8");
        request.ContentType = @"application/xml; charset=utf-8";
        requestBuffer = Encoding.ASCII.GetBytes(requestString);
        request.ContentLength = requestBuffer.Length;
        request.UseDefaultCredentials = true;
        postStream = request.GetRequestStream();
        postStream.Write(requestBuffer, 0, requestBuffer.Length); 
        postStream.Close();

        response = (HttpWebResponse)request.GetResponse();
        responseStream = response.GetResponseStream();
        string response_result=string.Empty;
        if (responseStream != null)
        {
            responseReader = new StreamReader(responseStream);
            response_result = responseReader.ReadToEnd();
        }
        MessageBox.Show(response_result);
    }

    private string LoadData()
    {
       // throw new NotImplementedException();
        XmlDocument oCustomer = new XmlDocument();
        oCustomer.Load(@"C:\Users\kishore.LOCAL.000\Desktop\NAV_DEMO\NAV_DEMO\bin\Debug\input\item.xml");
        return oCustomer.InnerXml;
    }

Формат SOAP Envelope приведен ниже:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:ins="urn:microsoft-dynamics-schemas/page/nav_item">
<soapenv:Header/>
<soapenv:Body>
  <ins:Create>
     <ins:nav_Item>
        <!--Optional:-->
        <ins:Key>?</ins:Key>
        <!--Optional:-->
        <ins:No>1234</ins:No>
        <!--Optional:-->
        <ins:Description>Test Item</ins:Description>
        </ins:nav_Item>
  </ins:Create>
 </soapenv:Body>
</soapenv:Envelope>

Но когда я пытаюсь получить ответ без заголовка в HttpWebRequest, он возвращает всю веб-службу в формате xml со статусом OK, но элемент не вставляется в NAV.

Когда я пытаюсь получить ответ с заголовком в HttpWebRequest, его {"Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера". System.Net.WebExceptionStatus.ProtocolError}

Я хочу создать элемент в NAV, используя мыльный конверт, а не напрямую ссылаясь на сервис.

Любая помощь будет мне полезна.

С уважением Кишор К.


person kishorebarik    schedule 15.06.2013    source источник


Ответы (2)


Похоже, вы используете SOAPui для создания запроса xml. Это приложение всегда добавляет невидимые символы в конце каждой строки. Удалите их.

Также попробуйте отформатировать свой запрос, например сделайте это в одну строчку. По неизвестной причине Nav угрожает разрыв строки между определенными тегами как ошибку (выдает http 500). Просто забыл, какие теги (могут быть заголовок и тело). Остальные переводы строк в порядке.

Заголовок SOAPAction является обязательным, поэтому используйте его, иначе вы все время будете получать wsdl в ответ.

P.s. бета-версия SOAPui отлично работает с Nav и поддерживает NTLM, поэтому вы можете использовать ее для тестирования различных XML-запросов и определения правильного формата.

person Mak Sim    schedule 16.06.2013
comment
Спасибо Мак, делаю, результат выложу. - person kishorebarik; 17.06.2013
comment
Привет, Мак, я использую SOAPUI v4.5.1, вы говорите о версии 4.5.2, но сейчас это не бета. - person kishorebarik; 17.06.2013
comment
Возможно, я пропустил какие-то обновления минорной версии. У меня установлен soapUI-4.5.1.1-SNAPSHOT, и он работал, когда soapUI-4.5.1 не работал. Это что-то вроде ночной версии. - person Mak Sim; 17.06.2013
comment
Вероятно, получил его здесь - person Mak Sim; 17.06.2013
comment
Спасибо, Мак, невидимые символы, о которых вы говорите, не невидимы, это видно, т.е. ‹! - Необязательно: -› это символы, которые генерируют ошибку. Немного изменив код, я обнаружил проблему, и она была решена. Еще раз спасибо - person kishorebarik; 17.06.2013
comment
Я только что столкнулся с той же проблемой (NAV 2016!), Xml был опубликован как однострочный, и он работает! - person azatoth; 19.01.2018

Я новичок в использовании интеграции с веб-службами nav, я пытаюсь отправить xml-запрос с помощью простого консольного приложения С #, но он всегда возвращает 401 (неавторизованный)

static void Main(string[] args)
    {
        Console.WriteLine("We have started");                                    

        string pageName = "http://hrp-dmu.uganda.hrpsolutions.co.ug:9047/DynamicsNAV80/WS/Uganda%20Management%20Institute/Page/CustomerWS";            
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(pageName);
        req.Method = "POST";
        req.ContentType = "text/xml;charset=UTF-8";
        req.ProtocolVersion = new Version(1, 1);
        req.Headers.Add("SOAPAction", @"urn:microsoftdynamicsschemas/page/customerws:Create");            

        Console.WriteLine("After preparing request object");
        string xmlRequest = GetTextFromXMLFile("E:\\tst3.xml");
        Console.WriteLine("xml request : "+xmlRequest);
        byte[] reqBytes = new UTF8Encoding().GetBytes(xmlRequest);
        req.ContentLength = reqBytes.Length;
        try
        {
            using (Stream reqStream = req.GetRequestStream())
            {
                reqStream.Write(reqBytes, 0, reqBytes.Length);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("GetRequestStreamException : " + ex.Message);
        }
        HttpWebResponse resp = null;
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
        }
        catch (Exception exc)
        {
            Console.WriteLine("GetResponseException : " + exc.Message);
        }
        string xmlResponse = null;
        if (resp == null)
        {
            Console.WriteLine("Null response");
        }
        else
        {
            using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
            {
                xmlResponse = sr.ReadToEnd();
            }
            Console.WriteLine("The response");
            Console.WriteLine(xmlResponse);
        }
        Console.ReadKey();
    }

    private static string GetTextFromXMLFile(string file)
    {
        StreamReader reader = new StreamReader(file);
        string ret = reader.ReadToEnd();
        reader.Close();
        return ret;
    }
person muyinza daniel    schedule 07.01.2016
comment
Вы не должны задавать новые вопросы в ответ на исходный вопрос. Особенно если проблема в другом. В какой строке вы фактически авторизуетесь? Предполагая, что вы не находитесь в одной локальной сети с этим адресом, вы должны явно указать учетные данные. - person Mak Sim; 20.01.2018