【问题标题】:How to pass parameters to [OperationContract] webservice method from jquery/ajax?如何从 jquery/ajax 向 [OperationContract] webservice 方法传递参数?
【发布时间】:2010-12-08 22:43:23
【问题描述】:

我想从 jquerys ajax 将参数传递给我的 web 服务。我该怎么做?

我已经查看了一些相关问题,但找不到适合我的解决方案。我试过这个:jQuery AJAX parameter not being passed to MVC 但我没有使用 mvc,所以我确定这就是解决方案不起作用的原因。 我的 jquery 看起来像这样:

            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "CarService.svc/GetCar",
                data: {CarID:117},
                dataType: "json",
                success: function (data) {
                    $("#lblCurrentTime").text("");
                    $("#lblCurrentTime").text(data.d.CarID);
                }
            });

我的“数据”部分有问题,对吗?如果将数据:部分保留为数据:“{}”,我可以让我的方法运行(并且我不传递任何参数)但是当我尝试上述方法时,萤火虫告诉我:

Firebug's log limit has been reached. 0 entries not shown.  Preferences  
POST http://localhost:64461/TimeService.svc/GetCar
POST http://localhost:64461/TimeService.svc/GetCar

500 Internal Server Error
  1.12s

我的 Web 服务如下所示:

[OperationContract]
    public CarTable GetCar(int id)
    {
        using (var sqlc = new SqlConnection(@"sdfgsdfg"))
        {
            sqlc.Open();
            var cmd = sqlc.CreateCommand();
            cmd.CommandText = "HUGE QUERY HERE ^^";
            //id = 117;
            cmd.Parameters.Add("CarID", System.Data.SqlDbType.Int).Value = id;
            using (var reader = cmd.ExecuteReader())
            {
                CarTable Cars = new CarTable();

                while (reader.Read())
                {
                    Cars.CarID = reader["CarID"].ToString();
                    Cars.CarName = reader["CarName"].ToString();
                }


                return Cars;

            }
        }
    }
[DataContract]
public class CarTable
{
    [DataMember]
    public string CarID { get; set; }
    [DataMember]
    public string CarName { get; set; }
}

编辑:如果我将数据部分更改为:

data: CarID=117,

我得到 Sys.ParameterCountException:参数计数不匹配。 [Break On This Error] {name: "format", type: String}

【问题讨论】:

  • 您是否可以使用 SoapUI 之类的工具调用您的网络服务?
  • 您是否尝试过“完成”而不是成功,并查看错误消息是什么?
  • 我不熟悉那个工具,但我现在就去看看。
  • 我刚刚在 SoapUI 上度过了最后几分钟,它让我感到非常困惑 -_- 这可能超出了我目前的理解范围。
  • {"ExceptionDetail":null,"ExceptionType":null,"Message":"由于内部错误,服务器无法处理请求。有关错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults(来自 ServiceBehaviorAttribute 或来自 配置行为),以便将异常信息发送回客户端,或根据 Microsoft .NET Framework 3.0 SDK 文档打开跟踪并检查服务器跟踪日志。 ","StackTrace":null}

标签: jquery ajax wcf web-services


【解决方案1】:

首先你应该验证你是否包含属性

[WebInvoke (ResponseFormat = WebMessageFormat.Json)]

GetCar 方法或在 web.config 中执行相同操作。

其次,您应该使用data:"117"data:JSON.stringify(117) 而不是data: {feat:117}

更新:如果您有更复杂的数据输入,例如作为对象CarTabledata 参数应该是data:JSON.stringify({CarID: 117, CarName: "BMW"}),所以它应该以相同的方式构建。 JSON.stringifyhttp://www.json.org/js.html 中定义。

再说一句。成功返回数据后,你会看到返回的数据应该不是data.d.CarID,而是data.CarID。 ASMX 网络服务将数据放在属性d 中,而不是 WCF 服务中。

更新 2:我不知道你犯了哪个小错误,所以我创建了一个小的 WCF 服务来满足你的需要。你可以在这里http://www.ok-soft-gmbh.com/jQuery/WcfData.zip下载源代码。为了确保您能够编译它,我使用了 Visual Studio 2008。在 Visual Studio 2010 中,web.config 文件可以简单得多。

【讨论】:

  • 嗨,奥列格,谢谢!我将 [OperationContract] 替换为 [WebInvoke(ResponseFormat = WebMessageFormat.Json)]。但是当我尝试使用所有不同的选项传递数据时,我仍然会遇到相同的 500 错误。
  • 通常一个人同时使用[OperationContract][WebInvoke(ResponseFormat = WebMessageFormat.Json)] 属性,但您只发布了定义的一部分......我希望其余部分是正确的。
  • 好的。我也保留了 operationContract,但仍然没有一个解决方案似乎正常工作。我一直收到 500 错误或 Sys.ParameterCountException:参数计数不匹配。 [Break On This Error] {name: "format", type: String}
  • 感谢您上传该测试。我现在就去看看!
  • @Robodude:查看更新部分并从ok-soft-gmbh.com/jQuery/WcfData.zip下载代码示例
【解决方案2】:
data: {CarID:117}, 

应该是:

data: "{'id':'117'}", 

数据参数必须是字符串。名称和值对需要被引用才能成为有效的 JSON。名称/值对的名称应与 Web 服务的输入参数匹配。

【讨论】:

    【解决方案3】:

    尝试改变

    data: {CarID:117},
    

    只给data: {id:117},

    【讨论】:

      【解决方案4】:

      我认为参数名称需要与服务上的调用相匹配。

      尝试改变

      data: {CarID:117},

      只是 data: {ID:117},

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多