2012-08-02 48 views
4

我的情景: 我使用MonoTouch的爲iOS打造的iPhone應用程序。我正在調用ASP.NEt MVC 4基於Web API的http服務來登錄/註銷。對於登錄,我使用POST webmethod和一切都很好。對於註銷,我打電話給刪除網絡方法。我想將JSON數據(序列化的複雜數據)傳遞給Delete調用。如果我將簡單的數據(比如單個字符串參數)作爲URL本身的一部分傳遞,那麼所有的就是Delete都行得通!爲了通過複雜的JSON數據,這裏是我的電話(我已經調整了代碼,使其簡單的通過顯示只有一個參數 - 用戶名被通過JSON發送):的MonoTouch/iPhone - 呼叫到HttpWebRequest.GetRequestStream()連接到服務器時,HTTP方法是刪除

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost/module/api/session/"); 
     req.ContentType = "application/json"; 
     req.CookieContainer = jar; 
     req.Method = "Delete"; 
     using (var streamWrite = new StreamWriter(req.GetRequestStream())) 
     { 
      string jSON = "{\"UserName\":\"" + "someone" + "\"}"; 
      streamWrite.Write(jSON); 
      streamWrite.Close(); 
     } 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 

在服務器上,刪除方法看起來已經此定義:

public void Delete(Credentials user) 

其中憑證是複雜類型。

現在,這是問題!

上面的代碼,一旦進入該服務器上的刪除方法,因爲它擊中:

req.GetRequestStream() 

,因此發送到刪除方法的參數最終被空

而這裏的奇怪的部分: 如果我使用完全相同的代碼使用測試VS 2010的Windows應用程序,甚至上面的代碼工作...即它不會調用Delete直到req.GetResponse()被調用!在這種情況下,Delete方法的參數是一個有效的對象!

問題

任何意見或這是MonoTouch的一個bug,如果是這樣,任何解決方法嗎?

注:

如果我改變刪除定義公共無效刪除(用戶名字符串) 和替代JSON,如果我傳遞參數的URL本身的一部分,一切正常。但就像我說的這只是一個簡單的例子來說明我的問題。任何幫助表示讚賞!

回答

2

這似乎是不明確的。看到這個問題的更多細節:Is an entity body allowed for an HTTP DELETE request?

一般MonoTouch的(基於單聲道)會盡量特性/錯誤與Microsoft .NET框架,以緩解平臺之間的代碼的可移植性兼容。

IOW如果MS.NET忽略DELETE方法的主體,那麼MonoTouch也是如此。如果行爲不同,那麼應該填寫錯誤報告http://bugzilla.xamarin.com

+0

嗨poupou,感謝您的回覆。我確實審查了鏈接 - 雖然早期評論表明身體被忽略,但有一條新的評論說這是允許的。無論如何,就像我在原始消息中提到的那樣,相同的代碼在Visual Studio 2010窗體應用程序中工作 - 即它不會忽略發送的附加json數據。聽起來我應該提交bugzilla報告。讓我知道,如果你認爲否則我會這樣做。 – 2012-08-07 12:35:04

+0

完成。提交了一份關於bugzilla的報告。感謝poupou! – 2012-08-08 21:01:41

+0

@AMSIDev您可以發佈bugzilla報告的網址嗎?非常感謝! – 2013-07-24 08:38:05