1

如何从 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 编码(NSJSONSerialization用于将 aNSDictionary转换为 JSON 字符串)。.svc相同的方法适用于另一个未连接到 WCF 的Web 服务 ( ),它的操作以相同的方式注释。

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

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

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

更新 2:服务操作的MSDN 页面似乎表明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();
}

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

4

1 回答 1

0

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

于 2012-09-27T22:53:42.437 回答