ADO.NET DataService:将参数传递给[WebInvoke]方法

时间:2008-12-23 01:05:01

标签: wcf-data-services

请考虑以下示例:

public class SomeBusinessLayerService : DataService<MyEntityContainer>
{
 [WebInvoke]
 void DoSomething(string someParam)
 {
 }
}

我找不到关于如何将参数传递给函数的示例或任何帮助! 使用WebClient(或使用fiddler进行goofinfg)我可以触发函数调用,但无论我尝试参数,someParam总是为null 更糟糕的是 - 如果我将类型更改为int - 我的所有尝试都会以下列错误结束:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code></code>
  <message xml:lang="en-US">Bad Request - Error in query syntax.</message>
</error>

任何人都可以帮助我解决POST内容的工作示例吗?

注意:这是DataService,而不是WCF服务。我可以使用相同的方法使用WCF服务,没有任何问题。

编辑:我还需要POST的示例,而不是在URI中嵌入参数,因为URI有大小限制和清理字符串的要求。

5 个答案:

答案 0 :(得分:5)

在“错误请求 - 查询语法错误”响应的同时还拉了我的头发几个小时后,我终于通过传递URI中的参数来实现它。

特别注意字符串参数周围的引号:

WRONG:DoSomething?someParam = param CORRECT:DoSomething?someParam ='param'

答案 1 :(得分:1)

可能你应该尝试在带引号的URI中使用param(DoSomething?someParam ='param')。我试过这个并且它运行正常,在其他情况下我收到了和你一样的错误。

答案 2 :(得分:0)

我从未收到微软团队对该问题的回复,因此我找到了以下解决方法:

创建一个名为FunctionRequest的表,其中包含RequestID,Result和Paramerter string
要执行请求,我只需创建对象 如果我需要发送复杂对象 - 我使用DataContext序列化将其发送到服务器 现在所有的呼叫都记录在数据库中 - 这非常适合记录。

答案 3 :(得分:0)

要完成一点antscode response,您不仅要密切注意用引号围绕参数值......

但是!您还必须使用“guid”为Guid值添加前缀。像这样:

var y = ctx.Execute<bool>(new Uri("ReportExists?id=guid'" + Guid.NewGuid() + "'", UriKind.Relative));

答案 4 :(得分:0)

我遇到了类似的问题,我使用POST以x-www-form-urlencoded标记的方式发送param1=value1&param2=value2...格式([WebInvoke])的表单参数,并且我很难理解如何获取参数。我终于通过以下方式实现了它:

[WebInvoke]
void DoSomething(Stream requestStream)
{
    StreamReader reader = new StreamReader(stream);
    var requestContent = reader.ReadToEnd();
    var parameters = HttpUtility.ParseQueryString(requestContent);
    var param1 = parameters["param1"];
    var param2 = parameters["param2"]; //and so on...
}