2

我正在使用 javascript 和 servicereference 调用 .net 2.0 asmx 服务。当我在测试环境和本地调用服务时,一切正常。在生产中,我收到错误 500。我在事件日志中看不到任何错误或在任何地方显示。

如果我直接点击 Web 服务,那么我会收到 json 格式的数据。如果我使用 servicereference 从 javascript 调用 Web 服务,则会收到错误 500。

我认为这可能与大小限制有关,因为我可以减少数据点的数量并且数据通过 javascript 正确返回。

我尝试增加 httpRuntime 中的 maxRequestLength 但这没有任何影响。是否有一些我缺少的设置?

如果您查看此页面:http ://bit.ly/NXBFpD ,您将看到返回的数据没有错误。

如果您查看此页面并查看在 firebug 中进行的调用,您会看到调用了与上述相同的页面,但返回了错误 500。http://bit.ly/NXBPO1

这是被调用页面上的代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
            ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("/Services/FusionService.asmx"));
        }
    }
}

这是调用服务的js代码:

function GetGeometries(sw, ne, metro) {
    FusionService.GetGeometries(sw.lat(), sw.lng(), ne.lat(), ne.lng(), metro, drawMap);
}

这是服务:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class FusionService : System.Web.Services.WebService
{
private string url = "https://www.googleapis.com/fusiontables/v1/query";

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public string GetGeometries(decimal southWestLat, decimal southWestLng, decimal northEastLat, decimal northEastLng, string metro)
{
    try
    {
        var jss = new JavaScriptSerializer();
        string key = string.Format("Geometry-{0}", metro);

        var geometryData = HttpContext.Current.Cache[key] as string;

        if (!string.IsNullOrEmpty(geometryData))
        {
            var deserialized = jss.Deserialize<GeometryData>(geometryData);
            return jss.Serialize(deserialized);
        }

        var query = "SELECT name, geometry, FranchiseI, latitude, longitude, STATE FROM " +
                    "1JNOz_lhP1B8oCzeNLBm8u5k6ezdRDKtM-NBD8 where ST_INTERSECTS(geometry, RECTANGLE(LATLNG("
                    + southWestLat + "," + southWestLng + "), LATLNG(" + northEastLat + "," + northEastLng + ")))";

        var requestString = url + "?sql=" + HttpUtility.UrlEncode(query) + "&key=AIzaSyCXLd2VlvZ0FNLbgMKsfSq7Uvp3IDwa";

        var request = WebRequest.Create(requestString) as HttpWebRequest;

        using (var response = request.GetResponse() as HttpWebResponse)
        {
            var reader = new StreamReader(response.GetResponseStream());

            var json = reader.ReadToEnd();
            json = json.Replace("NaN", "\"\"");

            HttpContext.Current.Cache[key] = json;
            var deserialized = jss.Deserialize<GeometryData>(json);

            return jss.Serialize(deserialized);
        }
    }
    catch(Exception ex)
    {
        return ex.Message;
    }
}

}

4

2 回答 2

1

这是由 JSON 可以序列化的大小限制引起的。我需要将此添加到我的 web.config 中。

<system.web.extensions>
    <scripting>
        <!--The Following lines value should be true in production server-->
        <scriptResourceHandler enableCompression="false" enableCaching="true" />
<webServices>
    <jsonSerialization maxJsonLength="5000000">
    </jsonSerialization>
  </webServices>
    </scripting>
</system.web.extensions>
于 2012-08-20T16:52:41.557 回答
0

从服务器上的浏览器调用 URL,您可能会看到错误的内容。或者 - 更改您的 web.config,以便您也可以从客户端浏览器查看实际错误:

放:

<customErrors mode="Off" />

这将允许您追踪问题并解决它!

于 2012-08-20T15:44:20.840 回答