Невозможно использовать веб-сервисы с помощью c #, но работает на postman

#c# #asp.net #web-services #postman #webrequest

#c# #asp.net #веб-сервисы #postman #веб-запрос

Вопрос:

Я пытаюсь вызвать webservice через httpwebrequest. Успешно добавлен XML-документ и заголовки, но по-прежнему выдается ошибка Internal Server Error 500. Тот же XML-документ, скопированный из режима отладки, отлично работает на postman. Мой код

 public HttpWebRequest CreateWebRequest(string url, string action)
    {
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
        webRequest.Headers.Add("SOAPAction",action);
        //webRequest.Headers.Add("ContentType","text/xml;charset="utf-8"");
         webRequest.ContentType = "text/xml;charset="utf-8"";
        //  "charset="utf-8"";
        webRequest.Accept = "text/xml";
        webRequest.Method = "POST";
        return webRequest;
    }
public string CallWebService()
    {
        try
        {
           
            var _url = "https://xxxxxxxxxx/siebel/app/eai/enu?SWEExtSource=WebServiceamp;SWEExtCmd=Executeamp;WSSOAP=1";
            var _action = @"""document/http://yyyyyy/:CreateFollowup""";

            XmlDocument soapEnvelopeXml = CreateSoapEnvelope();
            
            ServicePointManager
                .ServerCertificateValidationCallback  =
            (sender, cert, chain, sslPolicyErrors) => true;
            HttpWebRequest webRequest = CreateWebRequest(_url, _action);
            //InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
            
                Invoke(new Action(() =>
                {
                    listBox_Log.Items.Add("saving soapenvelope.");
                }));
                soapEnvelopeXml.Save(webRequest.GetRequestStream());
            
            // begin async call to web request.
            IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
           
            // suspend this thread until call is complete. You might want to
            // do something usefull here like update your UI.
            asyncResult.AsyncWaitHandle.WaitOne();
            
            // get the response from the completed web request.
            string soapResult = null;

            using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
            {
                Invoke(new Action(() =>
                {
                    listBox_Log.Items.Add("fetching response");
                }));
                using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
                {
                    Invoke(new Action(() =>
                    {
                        listBox_Log.Items.Add("collecting response");
                    }));
                    soapResult = rd.ReadToEnd();
                }
                Console.Write(soapResult);
            }
            return soapResu<
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
public XmlDocument CreateSoapEnvelope()
    {
       
        XmlDocument soapEnvelop = new XmlDocument();
        
        soapEnvelop.LoadXml(@"xml code");
        return soapEnvelop;
    }
  

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

Редактировать Здесь я добавляю изображения, как я пробовал веб-сервис в postman
введите описание изображения здесь
введите описание изображения здесь

Комментарии:

1. Если вы покажете, как вы создали запрос с помощью Postman, нам будет легче сравнивать

2. Также, что именно вы подразумеваете под «опробованным файлом WSDL», это слишком расплывчатое описание, чтобы кто-либо знал, правильно вы это сделали или нет.

3. Я примерно в 1000 раз отвечаю на этот вопрос. Заголовки по умолчанию в c # отличаются от других инструментов для http. Поэтому лучший способ решения проблемы — использовать сниффер, такой как wireshark или fiddler, и сравнить первый запрос в Postman и c #. Также проверьте версию TLS с ошибкой 500, которая используется. Пять лет назад отрасль решила исключить TLS 1.0 / 1.1 из-за утечек в системе безопасности. В июне Microsoft выпустила обновление для системы безопасности, отключающее TLS 1.0 / 1.1 на серверах. Клиенты должны убедиться, что используется протокол TLS 1.2 или 1.3. Если не указано, используется версия операционной системы по умолчанию.

4. @ADyson я добавил изображения postman для вас. Это работает здесь с теми же заголовками и XML-телом. И для файла WSDL я добавил его с помощью добавить ссылку на службу -> добавить веб-ссылку . Затем использовал его функцию. Но при получении ошибки Клиент обнаружил тип содержимого ответа «, но ожидал «текст / xml». Запрос не выполнен с пустым ответом

5. @jdweng, пожалуйста, не могли бы вы быть более конкретным или ясным, потому что я новичок в использовании веб-сервисов. Это мой первый раз. Ранее я получал сообщение об ошибке, что ваше упомянутое базовое соединение было закрыто: не удалось установить доверительные отношения для защищенного канала SSL / TLS. —> Система. Безопасность. Аутентификация. Исключение AuthenticationException: Удаленный сертификат недействителен в соответствии с процедурой проверки. . Но затем я добавил код обхода сертификата из Интернета, после чего он показывает новую ошибку Internal Server Error 500 . Может быть, то, что вы сказали, правильно, но я этого не понял.

Ответ №1:

Решаемая

После очень трудного поиска я каким-то образом узнал, что если веб-сервис успешно запускается на postman, он также предоставляет код для этого языка (чуть ниже кнопки сохранения). Поэтому я использовал этот код (основанный на RestClient). Моей ошибкой было не использовать r n и правильные пробелы в xml-документе. Итак, проблема заключалась в xml.

 //THis code used for ssl bypassing
ServicePointManager
                .ServerCertificateValidationCallback  =
            (sender, cert, chain, sslPolicyErrors) => true;


        var client = new RestSharp.RestClient(webservice_url)
        {
            Timeout = -1
        };
        var request = new RestSharp.RestRequest(Method.POST);
        request.AddHeader("Content-Type", "text/xml");
        request.AddHeader("SOAPAction", "action");
        request.AddParameter("text/xml", "<soapenv:Envelope xmlns:soapenv="url1" xmlns:hhm="url2">rnt<soapenv:Header>rntt<UsernameToken>username</UsernameToken>rntt<PasswordText>password</PasswordText>rntt<SessionType>None</SessionType>rnt</soapenv:Header>rn   <soapenv:Body>rn      <hhm:CreateFollowup_Input>rn         <hhm:FollowupAction>testing</hhm:FollowupAction>rn         <hhm:CloseOutSubReason></hhm:CloseOutSubReason>rn         <hhm:FolloUpStatus>Open</hhm:FolloUpStatus>rn         <hhm:Object_spcId>1-3B39WBFE</hhm:Object_spcId>rn         <hhm:Model></hhm:Model>rn         <hhm:CloseReason></hhm:CloseReason>rn         <hhm:FollowUpDate>08/20/2020</hhm:FollowUpDate>rn         <hhm:ExpectedPurchaseDate></hhm:ExpectedPurchaseDate>rn         <hhm:FollowUpQuestions></hhm:FollowUpQuestions>rn         <hhm:FollowUpDone></hhm:FollowUpDone>rn         <hhm:DSEName>10086S20</hhm:DSEName>rn         <hhm:MakeBought></hhm:MakeBought>rn      </hhm:CreateFollowup_Input>rn   </soapenv:Body>rn</soapenv:Envelope>", ParameterType.RequestBody);
        RestSharp.IRestResponse response = client.Execute(request);
        Console.WriteLine(response.Content);
        return response.Content.ToString();