В настоящее время я новый пользователь 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 до того, как сервер выполнит этот небольшой путь маршрутизации? Или, если нет, как удалить заголовок по умолчанию, когда он обнаружен, и это снова до того, как сервер сделает малый конец пути маршрутизации?