2012-08-02 47 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