Monotouch / iPhone - 当HTTP方法为DELETE时,调用HttpWebRequest.GetRequestStream()连接到服务器

时间:2012-08-02 20:53:58

标签: xamarin.ios httpwebrequest http-method

我的情景: 我正在使用Monotouch for iOS来创建iPhone应用程序。我正在调用ASP.NEt基于MVC 4 Web API的http服务来登录/注销。对于登录,我使用POST web方法,一切顺利。对于Logoff,我正在调用Delete web方法。我想将JSON数据(序列化复杂数据)传递给Delete调用。如果我传递简单的数据,如单个字符串参数作为URL本身的一部分,那么一切都很好,即删除确实有效!为了传递复杂的Json数据,这是我的调用(我调整了代码,通过只显示一个参数 - UserName通过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方法的参数最终为空

这是奇怪的部分: 如果我使用测试VS 2010 Windows应用程序使用完全相同的代码,即使上面的代码也可以工作......即在调用req.GetResponse()之前它不会调用Delete!在这种情况下,Delete方法的参数是一个有效的对象!

问题

任何想法或这是Monotouch的错误,如果是这样,任何解决方法?

注意:

如果我将删除定义更改为public void Delete(string userName) 而不是json,如果我将参数作为url本身的一部分传递,那么一切都很好。但就像我说的这只是一个简单的例子来说明我的问题。任何帮助表示赞赏!!!

1 个答案:

答案 0 :(得分:2)

这似乎是不明确的。有关详细信息,请参阅此问题:Is an entity body allowed for an HTTP DELETE request?

通常,MonoTouch(基于Mono)将尝试与Microsoft .NET框架兼容 feature / bug ,以简化平台之间的代码可移植性。

如果MS.NET忽略了DELETE方法的主体,那么MonoTouch也是如此。如果行为不同,则应在http://bugzilla.xamarin.com

填写错误报告