从WCF / ADO.NET数据服务中的请求主体接收参数

时间:2008-10-22 10:17:37

标签: .net javascript ajax wcf ado.net

我试着发布到ADO.NET数据服务,但参数似乎一路上都丢失了。

我有类似的东西:

[WebInvoke(Method="POST")]
public int MyMethod(int foo, string bar) {...}

我使用prototype.js进行ajax调用:

var args = {foo: 4, bar: "'test'"};
new Ajax.Requst(baseurl + 'MyMethod',
  method: 'POST',
  parameters: args,
  onSuccess: jadda,
  onFailure: jidda
}

如果我将“method:'POST'”替换为“method:'GET'”和“WebInvoke(Method =”POST“)”with“WebGet”,一切正常但现在(使用post)我得到的是:< / p>

  

错误请求 - 查询语法错误。

来自该服务。

唯一的解决方法(我不想使用)是即使在我执行帖子时也会在URL中发送所有参数。欢迎任何想法。

3 个答案:

答案 0 :(得分:2)

WCF和ASMX Web服务往往对请求正文有点挑剔,当你指定args时,请求通常被编码为表单帖子,即foo = 4&amp; bar = test而不是你需要指定javascript文字: - < / p>

   new Ajax.Request(baseurl + 'MyMethod', {
        method: 'POST',
        postBody: '{"foo":4, "bar":"test"}',
        encoding: "UTF-8",
        contentType: "application/json;",
        onSuccess: function(result) {
            alert(result.responseJSON.d); 
        },
        onFailure: function() {
            alert("Error");
        }
    });

答案 1 :(得分:0)

如果要使用POST,则需要在WebInvoke属性中指定要包装在请求中的参数,除非参数包含on object(例如消息协定)。这是有道理的,因为无法在没有json或xml包装的情况下序列化参数。

解包非XML确实是缺少根元素

<foo>1</foo>
<bar>abc</bar>

包装有效的XML

<Request>
   <foo>1</foo>
   <bar>abc</bar>
</Request>

此示例也适用于JSON

答案 2 :(得分:0)

你是说我应该把你喜欢的参数包装成

var args = {Request: {foo: 3, bar: "'test'"}}

或者我错过了什么?

我试图添加:

ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Wrapped

到WebInvoke属性但没有结果。我试图将“Content-Type”(在js POST ajax-call中)设置为“application / x-www-form-urlencoding”和“application / json; charset = utf-8”但没有结果。