返回错误条件到JavaScript客户端这是怎样的一个2部分的问题:从.NET Web服务方法
1)什么是更好的方法,让.NET转换原生对象到JSON,或使用包装并自己编码它们(例如公共字符串DataTableToJSON(DataTable))
2)如果第一个问题的答案是前一种方法,如何最好地将错误条件传递给客户端(JavaScript AJAX请求,通常使用jQuery或这个具体的案例,Sencha Touch(Ext))?我目前的方法(在这个问题中进一步解释)似乎工作得很好,但存在一个似乎依赖于客户端的问题。
我从Web服务返回响应的'旧'方式是将所有方法声明为字符串。我已经这样做了几年,它运作良好,但感觉有点笨拙。例如:
public string Test(){
try{
Dataset ds = SomeMethodThatReturnsADataSet();
} catch (Exception ex){
return "ERROR";
//my JS checks for these messages to be sure everything went OK on the server
}
return DataTable_To_JSON(ds);
//at the client this looks something like {d:"[[\"Row1Data\"],[\"Row2Data\"]]"}
}
显然,这在客户端创建一个轻微的开销,因为我们必须拥有的JavaScript的一个额外的行如var data = JSON.parse(response.d);
所以最近我开始意识到,鉴于Web服务的ResponseFormat = ResponseFormat.Json
说法,.NET将处理JSON编码的一些.NET对象(遗憾的是我无法让DataTable类型工作,但这是另一个问题)。所以,现在我的web服务方法看起来更像是这样的:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
public List<MyObject> GetMyObjectList(string arg){
List<MyObject> li = MyObjectClass.GetList(arg);
if(li.Count > 500){
//Since we must return a .NET List<MyObject> I can't return strings on error conditions, so this isn't an option:
return "TOO_MANY_RESULTS";
//I saw an example somewhere to do this which works _almost_ great:
throw new Exception("TOO_MANY_RESULTS");
}
return li;
}
就像我在代码中的注释说,抛出一个异常,返回HTTP 500具有很好的格式化的JSON响应这是很容易的陷阱,并在“失败”处理回调Ext.Ajax.request,像这样:在iPad上测试应用程序时(使用Chrome和Safari)
{"Message":"TOO_MANY_RESULTS","StackTrace":" at ...","ExceptionType":"System.Exception"}
然而,出于某种原因,我得到一个“通用”异常消息回应:
{"Message":"There was an error processing the request","StackTrace":"","ExceptionType":""}
我已经调试并追踪了代码,它确实在C#中触发了相同的“抛出新的异常”行,它并未在代码的其他部分失败。出于某种原因,看起来客户端的请求头部以某种方式影响了.NET决定返回的内容。
有没有人有什么想法试图让.NET总是返回我传入异常的消息?
编辑:还正确工作在Android(得到 “TOO_MANY_RESULTS” 在服务器响应)。我会尽快测试iPhone。
编辑2:在iPhone模拟器正确工作,物理iPhone是不是与我们的无线点沿着今天获得,无法测试实际设备。
谢谢Gregory,我会研究一下。我试图不要太深入这个原型,直到我找到正确的实现。由于Sencha Touch是MVC-ish,并且似乎希望在它背后有一个REST服务,这听起来像是一个很好的解决方案。 – BLSully
我最终将我的Web服务(这是一个ASMX)转换为Web服务,并且我的客户端依赖的错误问题消失了。现在所有设备都得到相同的响应。仍然好奇于'为什么',但不管如何,切换到WCF似乎是解决方案。感谢您的意见 – BLSully