我使用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;
}
}
}
答案 0 :(得分: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>
答案 1 :(得分:0)
从服务器上的浏览器调用URL,您可能会看到错误的内容。或者 - 更改您的web.config,以便您也可以从客户端浏览器中看到实际错误:
集:
<customErrors mode="Off" />
这将允许您追踪问题并解决它!