【问题标题】:Why ASP.NET webmethod returns 500 when query string parameters are passed为什么 ASP.NET webmethod 在传递查询字符串参数时返回 500
【发布时间】:2011-06-19 02:39:14
【问题描述】:

我有以下网络方法:

[WebMethod(true)]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public static String requestLocalCrime(string lat, string lng)
{
    try
    {
        // Initialize the WebRequest.

        String LocalCrime = "http://policeapi2.rkh.co.uk/api/crimes-street/all-crime?lat=" + lat + "&lng=" + lng + "";

        WebRequest webRequest;
        WebResponse webResponse;

        webRequest = HttpWebRequest.Create(LocalCrime) as HttpWebRequest;
        webRequest.Method = WebRequestMethods.Http.Get;
        webRequest.ContentType = "application/json; charset=utf-8";
        Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

        webRequest.Credentials = new NetworkCredential(
                ConfigurationManager.AppSettings["PoliceAPIUsername"].ToString(),
                ConfigurationManager.AppSettings["PoliceAPIPassword"].ToString());

        // Return the response. 
        webResponse = webRequest.GetResponse();

        using (StreamReader reader = new StreamReader(webResponse.GetResponseStream(), encode))

        {
            string results = reader.ReadToEnd();
            reader.Close();
            webResponse.Close();
            return results;
        }


    }
    catch(Exception e) {
        return e.Message;
    }
}

我通过 jQuery 调用:

 var params = {
            "lat": 50.819522,
            "lng": -0.13642
        }


$.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify({ "lat": params.lat, "lng": params.lng }),
            url: "crimerequest.aspx/requestLocalCrime",
            dataType: "json",
            // success: insertCallback 
            success: function (data) {
                var result = $.parseJSON(data.d);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);  // Returns 500
                alert(thrownError); // Internal Server Error
                return false;
            }
        });

问题是当前 LocalCrime 字符串以 500 中断,但如果我将其替换为:

String LocalCrime = "http://policeapi2.rkh.co.uk/api/leicestershire/C01/crime"

然后突然没有它的查询字符串值。

非常感谢任何帮助。

好的,我写了一个代理类,所以我现在可以调试了。 return results; 确实带回了我想要的东西,但它在一个数组中,也许这与它有关。我的数据看起来像这样(可能是客户端的某些东西弄错了这些数据):

[
{
    "category": "other-crime", 
    "id": 378815, 
    "location": {
        "latitude": "50.8188090", 
        "street": {
            "id": 379, 
            "name": "On or near Abbey Road"
        }, 
        "longitude": "-0.1196796"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "anti-social-behaviour", 
    "id": 377906, 
    "location": {
        "latitude": "50.8279907", 
        "street": {
            "id": 4721, 
            "name": "On or near Albion Street"
        }, 
        "longitude": "-0.1336384"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "anti-social-behaviour", 
    "id": 377849, 
    "location": {
        "latitude": "50.8279907", 
        "street": {
            "id": 4721, 
            "name": "On or near Albion Street"
        }, 
        "longitude": "-0.1336384"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "other-crime", 
    "id": 377801, 
    "location": {
        "latitude": "50.8279907", 
        "street": {
            "id": 4721, 
            "name": "On or near Albion Street"
        }, 
        "longitude": "-0.1336384"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "burglary", 
    "id": 377781, 
    "location": {
        "latitude": "50.8279907", 
        "street": {
            "id": 4721, 
            "name": "On or near Albion Street"
        }, 
        "longitude": "-0.1336384"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "vehicle-crime", 
    "id": 376569, 
    "location": {
        "latitude": "50.8279446", 
        "street": {
            "id": 6312, 
            "name": "On or near Alexandra Villas"
        }, 
        "longitude": "-0.1454119"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "anti-social-behaviour", 
    "id": 376525, 
    "location": {
        "latitude": "50.8279446", 
        "street": {
            "id": 6312, 
            "name": "On or near Alexandra Villas"
        }, 
        "longitude": "-0.1454119"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "anti-social-behaviour", 
    "id": 376519, 
    "location": {
        "latitude": "50.8279446", 
        "street": {
            "id": 6312, 
            "name": "On or near Alexandra Villas"
        }, 
        "longitude": "-0.1454119"
    }, 
    "context": "", 
    "month": "2011-04"
}, 
{
    "category": "anti-social-behaviour", 
    "id": 376518, 
    "location": {
        "latitude": "50.8279446", 
        "street": {
            "id": 6312, 
            "name": "On or near Alexandra Villas"
        }, 
        "longitude": "-0.1454119"
    }, 
    "context": "", 
    "month": "2011-04"
}
]

【问题讨论】:

  • 您是否在服务器上遇到任何异常,根据您的服务器代码,您应该会看到一些异常。
  • 问题是我在代理后面,无法从本地主机连接到远程主机。我每次都必须上传到服务器来尝试它,我得到的只是 500 内部错误
  • @J.W.:这通常对你来说是正确的吗?我的意思是这是为这个 uri 设置参数的正确方法吗?
  • 您可以在粘贴的代码中访问 e.Message catch(Exception e) { return e.Message; }?
  • @JW:我的代码没有遇到异常,它返回结果

标签: jquery asp.net json httpwebrequest webmethod


【解决方案1】:

查询字符串参数需要作为 JSON 传递。您没有正确传递它们,所以我猜 latlong 在您的网络方法中为空。要正确传递它们,请使用以下命令:

data: JSON.stringify({ "lat": params.lat, "lng": params.lng })

JSON.stringify 方法在现代浏览器中原生实现。如果您需要维护旧版浏览器,您可能需要包含 json2.js 脚本,如果浏览器支持它,它将使用本机方法,如果不使用它的实现。

另请注意,您的 Web 方法返回纯字符串。这意味着在客户端 data.d 将是一个字符串。如果你想把它当作一个对象来操作,你需要先解析它:

var result = $.parseJSON(data.d);

【讨论】:

  • 此应用不适用于桌面浏览器,仅适用于 iphone 和 android。但是,如果我的 json 格式不正确,那么我想我不应该得到结果,但是我得到了结果,并且只得到了一个 jqeury 错误,因为没有成功。我在问题中添加了代码返回的示例。
  • @XGreen,因为您的 Web 方法返回一个字符串,如果您希望能够在客户端将其作为对象进行操作,您需要评估 data.d 字符串以便将其转换为javascript 对象。例如,您可以使用var result = $.parseJSON(data.d);
  • 按照您的建议更新了 jq 部分,但仍然出现错误。请参阅 jq ajax 部分。
  • 另外,如果有人想知道为什么数据这么短,这里的犯罪率并不是非常低,我因为字数限制而削减了数据:)
【解决方案2】:

如果您收到此错误,这意味着您在概念上在某个地方做错了。理想情况下,ajax 场景仅适用于中小型服务器端调用,而不是用于获取大量数据,并且如果您使用异步请求那么你就是在自找麻烦。所以在这种情况下,最好去实现服务器端逻辑。但是如果你处于无法更改应用程序逻辑的阶段,现在将其添加到你的 web.config 中:

<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"></jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>

需要记住的重要一点是整数字段的最大值是 2147483647,并且这个限制必须保持在这个值的范围内。

但现在我真的很担心,因为我需要这个应用程序可以扩展以适应大量使用。我做了这项工作,但请让我知道如何改进我的练习。谢谢

【讨论】:

  • 也许我应该考虑对我的请求进行更具体的过滤,而不是仅经纬度?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多