我的场景: 我正在使用 Monotouch for iOS 创建一个 iPhone 应用程序。我正在调用基于 ASP.NEt MVC 4 Web API 的 http 服务来登录/注销。对于登录,我使用 POST 网络方法,一切都很好。对于注销,我正在调用 Delete web 方法。我想将 JSON 数据(序列化的复杂数据)传递给 Delete 调用。如果我将像单个字符串参数这样的简单数据作为 URL 本身的一部分传递,那么一切都很好,即删除确实有效!为了传递复杂的 Json 数据,这是我的调用(我调整了代码以使其变得简单,只显示一个参数 - 通过 JSON 发送的用户名):
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();
在服务器上,Delete 方法看起来有这样的定义:
public void Delete(Credentials user)
其中 Credentials 是一种复杂类型。
现在,问题来了!
上面的代码一命中就进入服务器上的 Delete 方法:
req.GetRequestStream()
因此发送到 Delete 方法的参数最终为 null
这是奇怪的部分:如果我在测试 VS 2010 Windows 应用程序中使用完全相同的代码,即使上面的代码也可以工作......即它不会调用 Delete 直到 req.GetResponse() 被调用!在这种情况下,Delete 方法的参数是一个有效对象!
问题
任何想法或这是 Monotouch 的错误,如果是,任何解决方法?
笔记:
如果我将删除定义更改为 public void Delete(string userName) 而不是 json,如果我将参数作为 url 本身的一部分传递,一切都很好。但就像我说的,这只是一个简化的例子来说明我的问题。任何帮助表示赞赏!