C#Web服务调用仅在第一次工作

时间:2017-09-01 06:36:52

标签: c# xml web-services soap

我正在制作一个应用程序来自动调用webservice函数的过程。 它是第一次工作并完成我称之为成功的第一个功能,但在接下来的电话中说:

  

InternalServerError

我的示例代码如下:

soapRequest = new XDocument(
                            new XDeclaration("1.0", "UTF-8", "yes"),
                            new XElement(ns + "Envelope",
                                new XAttribute(XNamespace.Xmlns + "soapenv", ns),
                                new XAttribute(XNamespace.Xmlns + prefijoText, myns),
                                new XElement(ns + "Header"),
                                    new XElement(ns + "Body",
                                        new XElement(myns + nombreFuncionText,
                                            new XElement(myns + parametroAEnviar, parametroFuncText))
                                )
                            ));

此代码构建了我必须以正确格式发送到Web服务的xml。 但它只适用于第一次迭代,第一次调用和下一次调用显示我之前评论过的InternalServerError。

另外,如果需要,我将下面的代码通过HttpClient调用Web服务:

try
                        {
                            using (var client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
                            {
                                // Se pasa la url del servicio web en la request
                                var request = new HttpRequestMessage() { RequestUri = new Uri(urlBBDDText), Method = HttpMethod.Post };
                                request.Content = new StringContent(soapRequest.ToString(), Encoding.UTF8, "text/xml");

                                request.Headers.Clear();
                                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
                                request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
                                request.Headers.Add("SOAPAction", soapActionText);

                                // Nombre de usuario y contraseña se le pasan al httpclient codificados. Opciones: Basic, NTLM, Digest
                                var credentials = Encoding.ASCII.GetBytes(usuarioText + ":" + passText);
                                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(credentials));

                                HttpResponseMessage response = client.SendAsync(request).Result;
                                if (!response.IsSuccessStatusCode)
                                {
                                    Console.WriteLine(response.StatusCode);
                                }

                            }
                        }

当我进入活动视图以查看发生了什么时,它会向我显示此消息:

  

服务Prueba中方法FuncionParam中的参数parametro1为null!

它表示 parametro1 为空,但是当我构建要发送的xml时,parametro1有值:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
   xmlns:pru="urn:microsoft-dynamics-schemas/codeunit/Prueba:FuncionParam">
    <soapenv:Header />
        <soapenv:Body>
            <pru:FuncionParam>
                <pru:parametro1>WSTEST06</pru:parametro1>
            </pru:FuncionParam>
        </soapenv:Body>
</soapenv:Envelope>

请注意,parametro1包含WSTEST06作为值,事件查看器如何表示为null?如何修复调用Web服务的InternalServerError? 任何帮助将非常感激:)

编辑:好的,它有效!我修复了它,我手工制作的xml与SOAP请求接受的相同,并且多次给我InternalServerError。

供您参考:SOAP请求接受此示例xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pru="urn:microsoft-dynamics-schemas/codeunit/Prueba">
   <soapenv:Header/>
   <soapenv:Body>
      <pru:FuncionParam>
         <pru:parametro1>ValueOfParameter</pru:parametro1>
      </pru:FuncionParam>
   </soapenv:Body>
</soapenv:Envelope>

我传递了错误的xml格式,如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pru="urn:microsoft-dynamics-schemas/codeunit/Prueba:FuncionParam">
   <soapenv:Header/>
   <soapenv:Body>
      <pru:FuncionParam>
         <pru:parametro1>?</pru:parametro1>
      </pru:FuncionParam>
   </soapenv:Body>
</soapenv:Envelope>
  

的xmlns:PRU =&#34;瓮:微软动力学-模式/ codeunit / Prueba:FuncionParam&#34;

有问题,在&#34; Prueba&#34;之后,骨灰盒是不正确的。是我调用的函数的名称和正确的字符串是直到&#34; Prueba&#34;字。

0 个答案:

没有答案