2010-01-20 55 views
4

我的問題類似於這個: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引用」工作,我將非常感激!

在此先感謝!

回答

7

SOAP只是您發佈到服務的有效負載格式,就這些。有一個爲字段和命名空間等定義的規範,並且有不同的SOAP版本,但實際上並沒有那麼多。 (除了它的使用非常詳細,但這是一個不同的主題。)

您需要從當前的WSDL開始。如果你知道你正在使用WSDL已經過時了,那意味着Web服務期望(需要)或可以使用(可選)的內容與你的定義不同。 WSDL是您進入web服務的契約門戶。您需要獲取當前的WSDL。

幸運的是,當我導航到https://misapi.ercot.com/2007-08/Nodal/eEDS/EWS/?WSDL(我通過在url的末尾附加「?WSDL」得到的),在跳過證書錯誤之後,bingo - 服務使用的WSDL 。您可以(a)將其保存在本地,或者(b)直接從Visual Studio中引用它來構建Web服務客戶端。由於證書錯誤,我建議在本地保存並從那裏建設。

這應該讓你開始。

相關問題