2010-10-05 78 views
5

我試圖從JSON格式的c#應用程序調用Web服務(.asmx)。Web服務拒絕接收參數並以JSON格式回覆

當我指定請求方法爲GET,並且不指定contentType。

(REQ是HttpWebRequest的)

req.Method = "GET"; 

一切運作良好,但我得到XML響應。
當我指定的內容類型:

req.ContentType = "application/json; charset=utf-8"; 

我得到

500內部服務器錯誤。

當我改變請求方法:

req.Method = "POST"; 

我只能調用參數的方法,它返回正確的json,但如果我嘗試調用帶有參數的方法,我再得到500錯誤。

Web服務代碼:

[WebMethod(EnableSession =true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string SimplestWebService() 
    {   
     return "hello"; 
    } 

,並與參數:

[WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string Echo(string aString) 
    {  
     return aString; 
    } 

任何想法將非常感激。

加入:也許我沒有寫POST請求的權利(現在我發送它的頭,就像一個GET請求)。有人能指導我嗎?

模式補充說:該網站確實被標記爲腳本:

[ScriptService] 
public class MyAPI : System.Web.Services.WebService 

,這裏是我如何建立我的POST請求(我真的傾向於認爲這就是問題所在):

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(methodUrl.ToString()); 
req.Method = "POST"; 
req.Headers.Add("aString","oren"); 
req.ContentLength = 0;  
... 
req.ContentType = "application/json; charset=utf-8"; 
req.Accept = "application/json; charset=utf-8"; 
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
{ 
    StreamReader sr = new StreamReader(res.GetResponseStream()); 
    result.Append(sr.ReadToEnd()); 
} 
... 

也試過:

req.Method = "POST";   
string postData = "aString=kjkjk"; 
req.ContentType = @"application/json; charset=utf-8"; 
req.Accept = @"application/json; charset=utf-8"; 
ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] byte1 = encoding.GetBytes(postData); 
req.ContentLength = byte1.Length; 
Stream newStream = req.GetRequestStream(); 
newStream.Write(byte1, 0, byte1.Length); 
newStream.Close();   

最後兩個注意事項:
1.此Web服務使用瀏覽器以XML格式工作。
2.詢問json,代碼從未到達Web服務的中斷點。所以這可能是一個IIS(我使用IIS 6.1)的問題。我試過MIME類型推薦here

非常感謝。

+0

您可以在代碼中配置輸出請求嗎?具體來說,你如何添加「aString」參數?這可能有助於調試問題。 – mikemanne 2010-10-06 19:42:36

+0

另外,ASMX類本身的標籤是:[ScriptService]?我認爲(不是100%肯定),這是使用POST模式請求和JSON格式的數據訪問Web服務所必需的。 – mikemanne 2010-10-06 19:45:08

+0

@mikemanne:非常感謝您的意見。更新。 – 2010-10-06 20:07:56

回答

5

更新2:

我使用fiddler2看一個成功的POST請求(從jQuery來我ASMX服務),我看可能是值得一試的差別:

Accept: application/json, text/javascript, */* 

還有一些其他的不同之處,但那是唯一一個跳出來作爲一個可能的吸菸槍。

更新應答(響應更新問題):

它看起來像你正確使用contentStream。但是,您推送到它的數據(「aString = kjkjk」)不是有效的JSON。如下文所述,您的數據可能需要在有效的JSON格式:

{'aString':'kjkjk'} 

原來的答案:

我相信你沒有正確地設置「ASTRING」的內容。對於POST方法請求,「有效負載」數據不適用於頭,它是請求本身的內容。因此,您需要將它流式傳輸到請求對象上;例如參見this MSDN reference。不要忘記還要設置請求的內容長度。

由於您是通過JSON實現服務(並指定JSON作爲內容類型),我相信您需要將JSON字符串轉換爲原始字節,這就是您將它推送到流。你的JSON字符串應該是這個樣子:

{'aString':'This is the text I want to echo.'} 

你可能需要做一些微調(我不是在一個地方,我可以簡單的將一個確切的代碼示例),但是這應該讓你朝着正確的方向前進。

+0

仍然沒有運氣..需要一個更具體的答案 – 2010-10-07 17:32:35

+0

一個愚蠢的事情:確保您的URL(methodUrl)是針對正確的Web服務(HTT://yourmachine/MyAPI.asmx/Echo)。(故意拼寫錯誤的'http',所以它會在這個評論中正確顯示) – mikemanne 2010-10-07 17:46:02

+0

應該爲自己感到羞恥( - :.只能在22小時內才能給你獎勵(SO規則),謝謝。 – 2010-10-07 17:54:20

0

ContentType對我來說似乎是請求的內容類型,而不是響應。如果您發送Accept標題,會發生什麼情況(通知服務器您願意接受的內容類型)。

+0

結果與以前完全一樣,都是GET和POST。 – 2010-10-05 13:40:34

+0

檢查它在提琴手,我得到一個JSON響應:{「消息」:「處理請求時出錯。」,「StackTrace」:「」,「ExceptionType」:「」}(和500內部服務器錯誤在標題) – 2010-10-05 13:42:54

+0

此外,如果我嘗試省略contentType,我會得到一個XML響應。 – 2010-10-05 13:44:29