【发布时间】:2015-04-15 09:02:15
【问题描述】:
在服务端,我有一个非常简单的配置,通过 URL 传递参数时效果很好:
(sn-p)
builder.EntitySet<MappedAuthorizationGroup>("MappedAuthorizationGroups");
var function = builder.Function("TestMethod");
//parameter removed here, because I want to POST it ([FromBody])
//function.Parameter<string>("id");
function.ReturnsCollectionFromEntitySet<MappedAuthorizationGroup>("MappedAuthorizationGroups");
控制器方法的修饰还是相当简单的:
[HttpPost]
[ODataRoute("TestMethod")] //(id={id})")] // Again, parameter removed because i want to POST it
public IQueryable<MappedAuthorizationGroup> TestMethod([FromBody]string id)
{
... code ...
}
现在,这里有几个关于如何通过 AJAX 调用它的答案,但我已经在使用 microsoft odata 客户端 (DataServiceContext) 进行所有“正常”Odata 调用(CRUD 操作)......所以我想也可以将它用于这些自定义调用(我假设使用 .Execute()?)
我非常简单的客户端代码:
var client = new Default.Container(new Uri("thecorrectURI"));
var methodURI = new Uri(client.BaseUri, "TestMethod");
var recs = client.Execute<MappedAuthorizationGroup>(methodURI, "POST", new BodyOperationParameter("id", "C26DFAF6-8F32-429B-9DB3-2F8CF0ABBD3A"));
但是,当它到达服务器时,这不会正确填充应该是 [FromBody] 的字符串“id”参数。经过调查,这似乎是因为 1 或 2 个原因:
内容类型错误。但是,如果我将内容类型设置为“application/x-www-form-urlencoded; charset=utf-8”,我会在服务器上得到一个不同的错误,因为它需要 json,我认为这应该只适用于单个原始参数。
BodyOperationParameter() 序列化为 JSON,但由于某种原因,这在服务器端不起作用。许多帖子提到它只与简单的“=myvalue”传递兼容。这个对吗?如何从 DataServiceContext 对象执行此操作?我是否必须从更通用的对象(如 HttpClient 对象)进行此调用,在该对象中设置正确的标头和正文内容非常容易?
我想将它移动到正文而不是简单 URL 的原因是,这个参数实际上是一个序列化的 GUID 列表,很可能比在 URL 中设置的要多。
【问题讨论】:
标签: .net client odata asp.net-web-api