2

我正在尝试发布到 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
}

如果我用“方法:'GET'”和“WebInvoke(Method =“POST”)”替换“方法:'POST'”和“WebGet”一切正常,但现在(使用post)我得到的是:

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

从服务。

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

4

3 回答 3

2

WCF 和 ASMX 网络服务往往对请求正文有点挑剔,当您指定 args 时,请求通常被编码为表单 post 即 foo=4&bar=test 而您需要指定 javascript 文字:-

   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");
        }
    });
于 2008-12-12T23:49:20.323 回答
0

如果要使用 POST,则需要在 WebInvoke 属性中指定要包装在请求中的参数,除非参数包含对象(例如消息合同)。这是有道理的,因为如果不包装在 json 或 xml 中,就无法序列化参数。

未包装的确实不是 XML,因为缺少根元素

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

已包装的有效 XML

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

此示例也适用于 JSON

于 2008-10-22T10:27:30.550 回答
0

你是说我应该像javascript一样包装参数吗

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

还是我错过了什么?

我试图添加:

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

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

于 2008-10-22T11:36:49.647 回答