从iOS调用WCF数据服务服务操作

时间:2012-09-27 15:41:30

标签: ios json wcf-data-services odata

如何从iOS调用WCF中的服务操作?

我在我的WCF数据服务中定义了一个服务操作(绑定到我的数据库模式中的存储过程),我需要从iOS调用。假设我在.svc.cs文件中有以下声明:

[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public IQueryable<Foo> GetFoos(int param1, DateTime param2, string param3)
{
  return CurrentDataSource.GetFoos(param1, param2, param3).AsQueryable();
}

我已经在InitializeService中设置了适当的权利:

config.SetServiceOperationAccessRule("GetFoos", ServiceOperationRights.AllRead);

当我尝试通过iOS上的HTTP POST调用此命令时,我收到了一个用JSON包装的错误:

  

错误请求 - 查询语法错误。

好像我不喜欢我传递参数的方式。我在POST请求的请求主体中传递了JSON编码(使用NSJSONSerializationNSDictionary转换为JSON字符串)。相同的方法适用于另一个未连接到WCF的Web服务(.svc),该WCF的操作注释方式相同。

以类似的方式对我的另一个问题提出answer表明数据格式可以在客户端和服务器之间进行协商,我read这些日期很难格式化,所以也许它是我的DateTime参数是个问题。但是我尝试了JSON格式(\/Date(836438400000)\//Date(836438400000)/)和JSON Light格式(1996-07-16T00:00:00)都无济于事。

所以我的问题是:调用此操作的正确方法是什么?如果我需要让我的应用程序告诉服务器期望什么格式,我该怎么做?

更新:我尝试使用this question中提到的格式datetime'1996-07-16T00:00:00'。同样的错误。

更新2 MSDN page for Service Operations似乎建议在为服务操作注释Method = "POST"时,除WebInvoke之外不支持任何内容。我尝试从上面的代码中引用删除所有内容并将方法设置为POST。同样的错误。

更新3 :在Pawel的建议下,我在我的数据服务上做了一个新的服务操作:

[WebInvoke(Method = "POST")]
public IQueryable<string> GetFoos()
{
    List<string> foos = new List<string>();
    foos.Add("bar");
    return foos.AsQueryable();
}

我可以通过将方法设置为POST,将accept:application/json;charset=utf-8Content-Length:0添加到标题中,使其在Fiddler的Composer窗格中正常工作。然后我在操作中添加了一个int参数(称为param1)。我将我在Fiddler中的请求正文设置为{"param1":"1"}并运行它(并且Fiddler自动更新了我的内容长度标题),并得到了同样的错误。我将我的参数类型更改为字符串并再次运行我的请求并且它有效。所以我的问题似乎是非字符串类型。

1 个答案:

答案 0 :(得分:0)

您需要在Url中发送参数,而不是在请求正文中发送。