У меня есть код VBA, который вызывает службу SOAP и получает ответ XML.Я хочу написать C # REST API для вызова этой службы SOAP аналогичным образом.
Ссылаясь на статьи, я написал запрос SOAP, но он не работает и возвращает приведенную ниже ошибку.Я могу вызвать этот сервис SOAP из кода VBA, а также POST MAN.Кто-нибудь может объяснить, что не так с моим кодом?
public class CallSOAPAPIController : ApiController
{
[HttpGet]
public string Extract()
{
HttpWebRequest request = CreateWebRequest();
XmlDocument soapEnvelopeXml = new XmlDocument();
soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?><soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:inc=""http://www.test-xyz.com/""><soap:Body>Calendar @Year@Month@1</soap:Body></soap:Envelope>");
using (Stream stream = request.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
using (WebResponse response = request.GetResponse())
{
using (StreamReader rd = new StreamReader(response.GetResponseStream()))
{
soapResult = rd.ReadToEnd();
Console.WriteLine(soapResult);
}
}
return soapResult;
}
/// <summary>
/// Create a soap webrequest to [Url]
/// </summary>
/// <returns></returns>
public static HttpWebRequest CreateWebRequest()
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"http://test.production-xyz.com/listofemployees.do?getdetails=all&SOAP");
webRequest.Headers.Add(@"SOAP:Action");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
CallSOAPAPIController obj = new CallSOAPAPIController();
string base64Credentials = obj.GetEncodedCredentials();
webRequest.Headers.Add("Authorization", "Basic " + base64Credentials);
return webRequest;
}
private string GetEncodedCredentials()
{
string m_Username = "XXXXXX";
string m_Password = "XXXXXX";
string mergedCredentials = string.Format("{0}:{1}", m_Username, m_Password);
byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
return Convert.ToBase64String(byteCredentials);
}
}
Я получаю сообщение об ошибке: «Удаленный сервер возвратил ошибку: (401) Несанкционированный»
Несанкционированный (401)