【问题标题】:passing list<string> as argument to web service returns 500 error将 list<string> 作为参数传递给 Web 服务返回 500 错误
【发布时间】:2013-10-25 10:28:50
【问题描述】:

我有一个简单的web service,它接受字符串列表并将其显示在页面上。但它不适用于 List,它适用于单个字符串。

不知道怎么回事,请帮忙

ASMX

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<string> GetStrings(string[] names)
{
    return names.ToList();

}

jQuery

 var jsonData = [{ names: "Brian" }, { names: "Neville" }];
        $.ajax({
            url: "/JsonHelper/sample.asmx/GetStrings",
            data: JSON.stringify(jsonData),
            dataType: 'json',
            type: 'POST',
            contentType: 'application/json',
            success: function (data) {
                $('.resultJson').append(JSON.stringify(data.d));
               },
            error: function (data, status) {
                console.log("FAILED:" + status);
            }
        });
    });

错误

POST http://dev.sample.com/JsonHelper/sample.asmx/GetStrings 500 (Internal Server Error)
XHR finished loading: "http://dev.sample.com/JsonHelper/sample.asmx/GetStrings". jquery.js:8706
FAILED:error 

【问题讨论】:

    标签: jquery asp.net json web-services


    【解决方案1】:

    对 JSONData 变量做一个小改动,它就可以工作了..

     var jsonData = { names:["Brian", "Neville"]};
            $(document).ready(function () {
    
                $.ajax({
                    type: "POST",
                    url: "WebService1.asmx/GetStrings",
                    data: JSON.stringify(jsonData),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: fnsuccesscallback,
                    error: fnerrorcallback
                });
    
            });
    
            function fnsuccesscallback(data) {
                alert(data.d);
            }
            function fnerrorcallback(data, status, error) {
                alert(error);
            }
    

    你得到的 InternalServerError 是因为你发送的数据无法反序列化为字符串数组

    【讨论】:

    • 所有三个解决方案都适用于我... +1 并接受这个作为回答...谢谢
    【解决方案2】:

    在您的 AJAX 调用中将传统属性设置为 true 并更改数据属性并查看它是否有效:

    $.ajax({
    url: "/JsonHelper/sample.asmx/GetStrings",
    data:"{'names':'" + JSON.stringify(jsonData) + "'}" ,
    traditional:true,
    
    });
    

    编辑

    您传递的是一组名称对象。一个字符串数组应该是这样的:

    var myCars=new Array("Saab","Volvo","BMW");
    

    var names = ['Brian','Abc'];
    

    【讨论】:

      【解决方案3】:

      刚刚在我的本地机器上尝试过,它可以工作。

      为了解释,我添加了一个变量来获取所有名称字符串,然后对其进行字符串化(但也传递了我的 web 方法的参数名称)......也在你缺少的 web 方法上 @987654321 @keyword(复制时一定要修改url) :

      <script type="text/javascript">
              $(document).ready(function () {
                  var array = ["Brian", "Neville"];
                  var jsonData = JSON.stringify({ names: array }); ;
                  $.ajax({
                      url: "Default.aspx/GetStrings",
                      data: jsonData,
                      dataType: 'json',
                      type: 'POST',
                      contentType: 'application/json',
                      success: function(data) {
                          $('.resultJson').append(JSON.stringify(data.d));
                      },
                      error: function(data, status) {
                          console.log("FAILED:" + status);
                      }
                  });
              });
      </script>
      

      方法是:

      [WebMethod]
      [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
      public static List<string> GetStrings(string[] names)
      {
          return names.ToList();
      
      }
      

      附言。仅供参考,您可以将 Web 方法的参数更改为 List&lt;string&gt;,它仍然可以工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-20
        • 2019-08-05
        • 2014-04-06
        • 2021-10-27
        • 2013-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多