2010-11-15 108 views
3

我目前正在編寫一個C#web服務,它有幾個方法,其中一個必須接收HTTP POST請求。我做的第一件事就是改變web服務項目中的web.config文件,如下所示。.NET Web服務收到HTTP POST請求(500)內部服務器錯誤

<webServices> 
    <protocols> 
    <add name="HttpSoap"/> 
    <add name="HttpPost"/> 
    <add name="HttpPostLocalhost"/> 
    <add name="Documentation"/> 
    </protocols> 
</webServices> 

我可以在本地運行Web服務,當我在瀏覽器上的方法點擊,我可以看到它處理HTTP POST請求,並接受ARGS =字符串,因爲我的Web方法的簽名接受一個字符串參數命名參數。然後,我使用下面的代碼通過一個測試ASP.NET應用程序來測試此消息以觸發HTTP POST請求。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ConfigurationManager.AppSettings["PaymentHubURL"].ToString()); 

request.KeepAlive = false; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.Method = "POST"; 

StringBuilder sb = new StringBuilder(); 
sb.Append("message_type="); 
sb.Append(HttpUtility.UrlEncode("Txn_Response")); 

byte[] bytes = UTF8Encoding.UTF8.GetBytes(sb.ToString()); 
request.ContentLength = bytes.Length; 
using (Stream postStream = request.GetRequestStream()) 
{ 
    postStream.Write(bytes, 0, bytes.Length); 
} 

string test; 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    StreamReader reader = new StreamReader(response.GetResponseStream()); 

    test = reader.ReadToEnd(); 
} 

但是,當我運行這個我得到「遠程服務器返回一個錯誤:(500)內部服務器錯誤」。如果我刪除參數,通過刪除stringbuilder和字節代碼,以及在Web服務中沒有參數,它的工作。所以這顯然是一個參數問題。我實際上想發送更多數據,並且在Web服務中使用了string []參數,但這也失敗了。

任何人都可以幫忙嗎?

+2

你應該首先看錯誤細節,啓用細節顯示。你是否在調試模式下嘗試瞭解錯誤發生的位置? – Artemiy 2010-11-15 15:05:23

+1

是的,我在德魯模式下使用,asp.net應用程序發送請求和Web服務接收。但它並沒有進入調試,假定因爲參數不匹配。 – Neil 2010-11-15 15:09:38

+0

您可否複製您的網絡服務方法的簽名?我剛創建了一個測試服務,用你發佈的代碼向它發出了一個請求,並且它工作正常。 – 2010-11-15 16:47:40

回答

0

我可以猜測你錯誤地構建了HttpPost請求。

嘗試使用代碼顯示在下面的鏈接,以創建您的要求:

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

或者probabily響應不包含Unicode字符值

嘗試複製並粘貼此代碼得到迴應

System.Text.Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); 
    StreamReader objSR; 

webResponse = (HttpWebResponse)response.GetResponse(); 
StreamReader reader = webResponse.GetResponseStream(); 
objSR = new StreamReader(objStream, encode, true); 
sResponse = objSR.ReadToEnd(); 
+1

這正是我如何構建它,除了我使用'使用'關鍵字,所以我不需要關閉我的流。 – Neil 2010-11-15 15:46:41

+0

我編輯了我的答案 – 2010-11-15 16:56:35

+0

我應該說,在下面的語句運行時,它會在第二條使用語句中出現。 – Neil 2010-11-16 09:28:48

2

我建議你重新考慮你的方法。微軟已經編寫了用於使用Web服務的非常棒的庫,但有兩種方法可以實現它 - 「添加Web引用」和「添加服務引用」。

就你而言,你似乎有一個「asmx網絡服務」,所以我建議你在Visual Studio中爲你添加一個「web引用」項目。這假設你正在使用visual studio。

添加此Web引用後,您可以通過「新建」來創建客戶端。您可以在此客戶端上執行任何Web方法。這是使用Web服務最簡單的方法。你不必處理任何http複雜問題。

希望這會有所幫助。

相關問題