4

我的场景: 我正在使用 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 本身的一部分传递,一切都很好。但就像我说的,这只是一个简化的例子来说明我的问题。任何帮助表示赞赏!

4

1 回答 1

2

这似乎是不明确的。有关详细信息,请参阅此问题:HTTP DELETE 请求是否允许实体主体?

一般来说,MonoTouch(基于 Mono)将尝试与 Microsoft .NET 框架的功能/错误兼容,以简化平台之间的代码可移植性。

IOW 如果 MS.NET 忽略 DELETE 方法的主体,那么 MonoTouch 也会如此。如果行为不同,则应在http://bugzilla.xamarin.com填写错误报告

于 2012-08-03T13:31:48.197 回答