如何从 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 标头),并得到了同样的错误。我将参数的类型更改为字符串并再次运行我的请求并且它有效。所以我的问题似乎是非字符串类型。