代码之家  ›  专栏  ›  技术社区  ›  finnsson

从wcf/ado.net数据服务中的请求主体接收参数

  •  2
  • finnsson  · 技术社区  · 16 年前

    我正在尝试发布到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”)替换为“webget”,那么一切正常,但现在(使用post)我得到的只是:

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

    从服务。

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   John Foster    16 年前

    wcf和asmx webservices在请求主体上往往有点选择,当您指定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");
            }
        });
    
        2
  •  0
  •   Ray Lu    16 年前

    如果要使用post,则需要在webinvoke属性中指定要包装在请求中的参数,除非参数包含on对象(例如消息协定)。这是有意义的,因为没有包装在JSON或XML中就无法序列化参数。

    未包装,这不是XML,实际上是缺少根元素

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

    包装,有效XML

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

    此示例也适用于JSON

        3
  •  0
  •   finnsson    16 年前

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

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

    还是我错过了什么?

    我试图补充:

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

    到WebInvoke属性,但没有结果。我尝试将“Content-Type”(在JS Post Ajax调用中)设置为“application/x-www-form-urlencoding”和“application/json;charset=utf-8”,但没有结果。