我的問題類似於這個:need to call soap ws without wsdl除了我的應用程序不使用Spring,所以答案沒有幫助。如何在C#中使用舊的WSDL + XSD和當前Web服務位置進行SOAP調用?
這是我有:
- 只接受SOAP的Web服務請求
- 電流端點URL爲Web服務
- 一個過時的WSDL和XSD文件
- 一個過時的樣品SOAP請求文件
我需要做的是:
- 使用上面的一些組合成功地發出SOAP請求。
我試圖從兩個不同的角度來解決這個問題,目前還沒有運氣。我的背景熟悉使用POST和GET的Web服務,但不熟悉SOAP。谷歌搜索 'C#SOAP' 後,我寫了下面的代碼:
void soap(String xmlfile)
{
Stream outputStream = null;
StreamReader reader = null;
WebResponse response = null;
try
{
string text = System.IO.File.ReadAllText(xmlfile);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://misapi.ercot.com/2007-08/Nodal/eEDS/EWS");
request.PreAuthenticate = true;
X509Certificate ercotCert = X509Certificate.CreateFromCertFile("D:\\Amigo\\WebSite1\\Nodal_Test_Cert.cer");
request.ClientCertificates.Clear();
request.ClientCertificates.Add(ercotCert);
ServicePointManager.ServerCertificateValidationCallback +=
new System.Net.Security.RemoteCertificateValidationCallback(customValidation);
request.Credentials = CredentialCache.DefaultNetworkCredentials;
// I don't actually have a SOAPAction, but have tried adding a fake one just to see
//request.Headers.Add("SOAPAction", "http://www.ercot.com/Nodal/Payload");
request.Method = "POST";
request.ContentType = "text/xml;charset=\"utf-8\"";
request.ContentLength = text.Length;
StreamWriter writer = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
writer.Write(text);
writer.Close();
response = request.GetResponse();
outputStream = response.GetResponseStream();
reader = new StreamReader(outputStream);
Response.Write(reader.ReadToEnd());
}
catch (WebException e)
{
// This is where it ends up, with Status="ProtocolError"
}
catch (System.Web.Services.Protocols.SoapException soapE)
{
// Never gets in here
}
catch (Exception e)
{
// Never gets in here
}
finally
{
if (outputStream != null)
outputStream.Close();
if(reader != null)
reader.Close();
if(response != null)
response.Close();
}
}
private static bool customValidation(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}
這將產生一個500內部服務器錯誤。它拋出一個WebException,其中不包含其他消息或內部異常,但Status是'ProtocolError'。我嘗試了其他排列,包括使用XmlDocument和其他內容類型,但沒有任何工作。
我試過的另一件事是在Visual Studio中使用「添加Web引用」。放入端點URL不起作用,並出現肥皂故障。相反,如果我指向我過時的wsdl的本地副本,那麼它將添加WebReference,但由於無法糾正的許多錯誤,我不會讓它使用它。我的猜測是,這些錯誤是由於wsdl過時導致的,比如名稱空間不匹配或無法在包含的URL中找到事物。如果我用當前Web服務端點URL替換這些URL,它仍然不起作用。
如果有人可以在我的代碼中找出問題,或者直接指導我如何讓「添加Web引用」工作,我將非常感激!
在此先感謝!