我在我的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
将NSDictionary
转换为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-8
和Content-Length:0
添加到标题中,使其在Fiddler的Composer窗格中正常工作。然后我在操作中添加了一个int参数(称为param1)。我将我在Fiddler中的请求正文设置为{"param1":"1"}
并运行它(并且Fiddler自动更新了我的内容长度标题),并得到了同样的错误。我将我的参数类型更改为字符串并再次运行我的请求并且它有效。所以我的问题似乎是非字符串类型。
答案 0 :(得分:0)
您需要在Url中发送参数,而不是在请求正文中发送。