【问题标题】:Post SOAP envelop to MS Dynamics NAV Web Service将 SOAP 信封发布到 MS Dynamics NAV Web 服务
【发布时间】:2013-06-15 05:55:45
【问题描述】:

我正在尝试使用 HttpWebRequest、HttpWebResponse 将 SOAP 信封直接发布到 Dynamics NAV Webservices。

代码:

        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 格式返回整个 Web 服务,并且状态正常,但项目没有插入到 NAV 中。

当我试图通过 HttpWebRequest 中的 Header 获得响应时,它的 {“远程服务器返回错误:(500) 内部服务器错误。” System.Net.WebExceptionStatus.ProtocolError}

我想使用肥皂信封在 NAV 中创建项目,而不是直接引用服务。

任何帮助都会对我有所帮助。

问候 基肖尔 K

【问题讨论】:

    标签: c# .net web-services soap dynamics-nav


    【解决方案1】:

    看起来您使用 SOAPui 创建请求 xml。这个应用程序总是在每行的末尾添加不可见的字符。删除它们。

    还可以尝试取消格式化您的请求,例如把它放在一行中。由于未知原因,导航威胁在某些标签之间换行作为错误(抛出 http 500)。我只是忘记了哪些标签(可能是标题和正文)。其余的换行符都很好。

    并且 SOAPAction 标头是强制性的,因此请使用它,否则您将一直得到 wsdl 响应。

    附: SOAPui beta 可以很好地与 Nav 配合使用并支持 NTLM,因此您可以使用它来测试不同的请求 xml 并找出正确的格式。

    【讨论】:

    • 谢谢 Mak,我正在做,我会发布结果。
    • 嗨,Mak,我使用的是 SOAPUI v4.5.1,你说的是 v4.5.2,但它现在不是测试版。
    • 也许我错过了一些小版本更新。我安装了soapUI-4.5.1.1-SNAPSHOT,当soapUI-4.5.1 不工作时它工作。这有点像 nightly 版本。
    • 大概知道了here
    • 我刚刚遇到了同样的问题(NAV 2016!),xml 已作为“单行”发布,并且可以正常工作!
    【解决方案2】:

    我是使用与导航 Web 服务集成的新手,我正在尝试使用简单的 c# 控制台应用程序发送 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;
        }
    

    【讨论】:

    • 您不应该在回答原始问题时提出新问题。特别是如果问题不同。您实际上在哪一行授权自己?假设您不在一个具有此地址的局域网中,您必须明确提供凭据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2013-03-02
    • 2014-03-23
    • 2017-07-13
    相关资源
    最近更新 更多