2011-08-09 102 views
1

返回错误条件到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是不是与我们的无线点沿着今天获得,无法测试实际设备。

回答

0

我可以回答第一个问题。除非JSON的默认WCF处理不适用于您,否则我不会承担定制开销。如果我偏离服务器端的标准WCF处理,特别是对于REST实现(这对您的移动场景非常有用),我会研究WCF Web API,该API现在已移至Microsoft的AppFabric团队。您可以在CodePlex上找到最新版本(仍处于测试阶段)。只有在需要时才会从内置的东西中散出,因为存在很多编码开销。

不能确定问题#2,因为我没有在等式的移动端工作过很多(我在服务器/ API端工作)。我也不确定WCF Web API是如何处理这个问题的,但至少会看到这个方向,特别是当你使用RESTful服务时。我推荐的理由是所有的迹象都表明,Web API是微软走向未来REST的方向。

+0

谢谢Gregory,我会研究一下。我试图不要太深入这个原型,直到我找到正确的实现。由于Sencha Touch是MVC-ish,并且似乎希望在它背后有一个REST服务,这听起来像是一个很好的解决方案。 – BLSully

+0

我最终将我的Web服务(这是一个ASMX)转换为Web服务,并且我的客户端依赖的错误问题消失了。现在所有设备都得到相同的响应。仍然好奇于'为什么',但不管如何,切换到WCF似乎是解决方案。感谢您的意见 – BLSully