2012-04-20 233 views
1

當我的SOAP請求發送到我的Web服務時,我得到了這個異常「遠程服務器返回錯誤:(500)內部服務器錯誤。」。 WebService有2個參數(int a,int b)。如果我刪除這兩個參數,那麼我不會得到任何異常。發送SOAP請求到WebService錯誤500

這是我第一次使用SOAP + WS。我做錯了什麼? 感謝您抽出時間。

編輯: 我的大學剛剛在我的代碼中發現錯誤。我正在發送無效標題。

這裏是缺少的頭部分:

request.Headers.Add("SOAPAction", "http://tempuri.org/Add"); 

另外,我使用的URL是不正確的。 錯誤:

http://localhost:62830/Service1.asmx/Add 

正確:

http://localhost:62830/Service1.asmx 

這裏是我的代碼 客戶認爲發送SOAP到WebService的

private void button2_Click(object sender, EventArgs e) 
    { 

     var url = UrlTextBox.Text; 
     var xml_file_path = FileTextBox.Text; 

     XmlDocument xml_doc = new XmlDocument(); 
     xml_doc.Load(xml_file_path); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

     request.Method = "POST"; 
     request.ContentType = "text/xml"; 
     request.Accept = "text/xml"; 
     request.Timeout = 30 * 1000; 

     Stream request_stream = request.GetRequestStream(); 
     xml_doc.Save(request_stream); 
     request_stream.Close(); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     Stream r_stream = response.GetResponseStream(); 

     StreamReader response_stream = new StreamReader(r_stream, System.Text.Encoding.Default); 
     string sOutput = response_stream.ReadToEnd(); 

     ResultTextBox.Text = sOutput; 

    } 

這裏的XML文件

 <?xml version="1.0" encoding="utf-8"?> 
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
     <soap12:Body> 
     <add xmlns="http://tempuri.org/" > 
     <a>5</a> 
     <b>10</b> 
     </add> 
     </soap12:Body> 
    </soap12:Envelope> 

這裏的WebService中的代碼

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
public class Service1 : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 
+0

也許讀他們作爲字符串,然後轉換成int可能有助於 – 2012-04-20 05:09:00

+0

我的計劃後是項目的複雜集合發送到Web服務。將它們作爲字符串讀取會很有用,可以將它們轉換爲複雜的類。 – Jack 2012-04-20 05:37:23

回答

0

手動構建SOAP信封似乎不是一個好主意。您應該依靠WSDL來「添加Web引用」,然後轉到WCF。

無論如何,這裏是我在web.config中使用WS

<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    <add name="HttpPost"/> 
    </protocols> 
    <conformanceWarnings> 
    <remove name="BasicProfile1_1"/> 
    </conformanceWarnings> 
</webServices> 
</system.web> 

此外,您還可以檢查是否WS工作在GET方式直接連接到的.asmx(在本地主機模式配置的一部分)

不知道它是否重要,但我會寫信封略有不同。 而且我會添加標題「Content-Length」。

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <a xmlns="http://tempuri.org/">5</a> 
    <b xmlns="http://tempuri.org/">10</b> 
    </soap12:Body> 
</soap12:Envelope> 
+0

感謝您的提示。該代碼是現有客戶端/ Web服務應用程序的一部分。我不確定這是否很容易將它們轉換爲您所建議的解決方案。 – Jack 2012-04-20 07:55:51