【问题标题】:Best Practice in OData for exceptions例外情况的 OData 最佳实践
【发布时间】:2013-09-23 08:05:03
【问题描述】:

我们正在使用 dot-net 使用 OData 服务。

当 odata 服务代码中引发任何异常或任何业务逻辑问题失败时,服务代码会处理该异常或错误,并向 dotnet 使用者返回带有该错误详细信息的新错误对象。

我认为它应该抛出一个异常并且在消费端我应该以我自己的方式处理它,这是一种好方法吗?

你有什么建议?

【问题讨论】:

    标签: c# wcf odata wcf-data-services


    【解决方案1】:

    两者都可以。在这两种情况下,您都需要一种特定的方式来传输服务状态和错误信息:

    // First case - the returned object contains status and error info.
    IResponse response = OData.Serve();
    if (response.Status == Status.Ok)
        ManageResponse(response );
    else 
        ManageError(response.Status, response.Error);
    
    // Second case - service rises an exception.
    IResponse response;
    try
    {
        response = OData.Serve();
        ManageResponse(response);
    }
    catch (ODataException e)
    {
        ManageError(e.Status, e.Error);
    }
    
    // Third case: Service returns correct response or null.
    // In case of error Service contains error info.
    IResponse response = OData.Serve();
    if (response != null)
        ManageResponse(response);
    else
        ManageError(OData.LastError);
    

    【讨论】:

    • 感谢 Miroslav 的回复。
    • 第二种情况很好。我只是以这种方式实现,但现在只有当 odata 会抛出异常时才会出现这种情况。
    • 第一种情况:响应状态始终正常。当服务有一些内部错误/异常时,它们会处理该异常并创建一个包含错误详细信息的对象并将其发送回客户端。然后客户端必须读取或解析该对象以检查错误。这是一个正确的方法吗?
    • 如果发生错误,服务必须返回具有正确状态的对象。一定不行。但是,如果该服务是第三方软件,则您没有其他选择。 ...我再举一个例子。
    • 您是否有任何链接可以准确说明在 odata 的情况下如何将异常传播给客户端?
    【解决方案2】:

    你也可以试试这样的:

                try
                {
                   //your Odata query and response code 
                }
                catch (DataServiceClientException dsce)
                {
                    logger.WarnFormat("Client Exception, Status Code - {0}", dsce.StatusCode.ToString());
                }
                catch (DataServiceRequestException dsre)
                {
                    logger.WarnFormat("Request Exception - {0}", dsre.Message);
                }
                catch (DataServiceQueryException dsqe)
                {
                    logger.WarnFormat("Query Exception, Status code - {0}", dsqe.Response.StatusCode.ToString());
                }
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多