2012-11-22 84 views
0

我有標準的asmx web服務返回JSON:POST到JSON webervice將返回錯誤500

private void ReturnUser(string name) 
{ 
    User user = new User(name); 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
    MemoryStream stream = new MemoryStream(); 
    serializer.WriteObject(stream, @object); 
    string jsonString = Encoding.UTF8.GetString(stream.ToArray()); 
    stream.Close(); 

    HttpContext.Current.Response.AddHeader("ContentType", "application/json"); 
    HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; 
    HttpContext.Current.Response.Write(jsonString); 
    HttpContext.Current.Response.End(); 
} 

在另一邊,我想嘗試的是Web服務正在運行,所以我嘗試撥打POST:

string data = "name=test"; 
byte[] dataStream = Encoding.UTF8.GetBytes(data); 

WebRequest request = WebRequest.Create("http://tempuri.org/External.asmx?op=ReturnUser"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = dataStream.Length; 
Stream reqStream = request.GetRequestStream(); 
reqStream.Write(dataStream, 0, dataStream.Length); 
reqStream.Close(); 
WebResponse response = (HttpWebResponse)request.GetResponse(); 

Stream stream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(stream); 
string json = reader.ReadToEnd(); 
stream.Close(); 
reader.Close(); 

Console.Write(json); 
Console.Read(); 

,但我得到錯誤500從瀏覽器的Web服務運行就像一個魅力:(

+0

錯誤500有時在你的.asmx方法所造成的錯誤的。檢查使用的認證。 – GiantHornet

+1

只是好奇,但你爲什麼手動序列化到JSON和直接寫入響應?如果它是ASMX服務並且從返回值中獲得JSON響應,您應該可以將其添加到方法中:[ScriptMethod(ResponseFormat = ResponseFormat.Json)] –

+0

我試圖使用[ScriptMethod(ResponseFormat = ResponseFormat.Json) ]但它返回XML。後來才知道它只能用於AJAX或jQuery,但我打算從非移動設備中調用它。 –

回答

0

最後,我解決了這個,可能是這可以幫助別人:

string data = "name=test"; 
byte[] dataStream = Encoding.UTF8.GetBytes(data); 

WebRequest request = WebRequest.Create("http://tempuri:org/External.asmx/ReturnUser"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
Stream stream = request.GetRequestStream(); 
stream.Write(dataStream, 0, dataStream.Length); 
stream.Close(); 
WebResponse response = request.GetResponse(); 

Stream respStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(respStream); 
string json = reader.ReadToEnd(); 
stream.Close(); 
reader.Close(); 

感謝所有

1

在多臺服務器,500系列錯誤是安全或權限錯誤。因爲你所得到的500錯誤,至少可以獲得與服務器的完全連接。

顯然,你的代碼永遠不會被調用,因爲它不能生成500錯誤 - 所以你依賴的服務器層正在這樣做。這聞起來像許可或安全。

服務器應該發送迴文本來說明正在發生的事情。檢查響應主體以獲取更多信息。它也可能有幫助的本地日誌記錄。我不得不用.NET代碼來解決類似的問題。我需要通過HTTP從服務器獲取信息,但它需要驗證。我無法使用任何集成安全方法,如Kerberos或基本身份驗證,因爲我使用基於cookie(有時稱爲基於表單)身份驗證的服務器。

如果您有問題,這可能幫助: .NET - Consuming HTTP services on (Domino) server with form based authentication

我的服務器是Domino中,但這個想法適用於任何HTTP服務器。

0

試試這個,

WebRequest request = WebRequest.Create("http://tempuri.org/External.asmx"); 
request.Headers.Add("SOAPAction", "\"http://tempuri.org/ReturnUser\""); 
-1

Websevices需要與POST請求明確指定表單操作價值。所以,請嘗試將表單「action」url添加到您的POST請求中。