Веб-сервер не маршрутизирует запрос SOAP, когда SOAPAction пуст - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время я новый пользователь StackOverflow, но я старый зритель.

У меня проблема с моим C# сервером, использующим файл asmx для WebService. Я переписываю старую службу Soap с новой структурой для связи с другими сложными службами.

Позвольте мне объяснить, у меня есть инструмент на основе службы soap, который я пытаюсь переписать. Когда он связывается с методом службы soap, он добавляет пустые данные «SOAPAction», вот в чем проблема.

Моя новая SOAP служба в C # основана на действиях тела , поэтому он перезаписывает заголовок SOAPAction через тело запроса SOAP. Только когда заголовок SOAPAction существует, но пуст, веб-сервер не перезаписывает действие, не может выполнить желаемый метод и, следовательно, возвращает 400 Bad Request.

Я пытался перехватить запрос перед маршрутизацией через этот код в файле Global.asax.cs:

        void Application_BeginRequest(object sender, EventArgs e)
        {
            var soapAction = HttpContext.Current.Request.Headers["SOAPAction"];

            if (string.IsNullOrEmpty(soapAction) || soapAction == "\"\"")
            {
                //Récupération du body et récupération de la balise sous body représentant l'action
                // Initialize soap request XML
                XmlDocument xmlSoapRequest = new XmlDocument();
                try
                {
                    // Get raw request body
                    using (Stream receiveStream = HttpContext.Current.Request.InputStream)
                    {
                        // Move to begining of input stream and read
                        receiveStream.Position = 0;
                        using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
                        {
                            // Load into XML document
                            xmlSoapRequest.Load(readStream);
                        }
                    }
                    XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(xmlSoapRequest.NameTable);
                    xmlNamespaceManager.AddNamespace("ns1", "http://www.genesyslab.com/services/sessionservice/wsdl/2002/03");
                    String nsAction = xmlSoapRequest.GetElementsByTagName("soapenv:Envelope")[0].FirstChild.InnerXml;
                    nsAction = nsAction.Substring("<ns1:".Length, nsAction.IndexOf(' ') - "<ns1:".Length);
                    HttpContext.Current.Request.Headers.Remove("SOAPAction");
                    HttpContext.Current.Request.Headers.Add("SOAPAction", "\"" + nsAction + "\"");
                }
                catch { }
            }
        }

SOAPAction имеет то же значение, что и при правильной обработке запроса сервером, но в случае этого взлома он по-прежнему возвращает 400 Bad Request.

При отладке функции Application_BeginRequest запрос уже содержит допустимое действие SOAPAction, а в SOAPUI я не добавлял заголовок SOAPAction. Если я добавлю его пустым, то при отладке запрос содержит пустое SOAPAction, сервер не изменяет значение с помощью SOAP запроса тела.

Поэтому мой вопрос заключается в следующем: есть ли у вас решение, позволяющее мне добавить мой заголовок SOAPAction через код метода Application_BeginRequest до того, как сервер выполнит этот небольшой путь маршрутизации? Или, если нет, как удалить заголовок по умолчанию, когда он обнаружен, и это снова до того, как сервер сделает малый конец пути маршрутизации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...