【问题标题】:Web API 2 OData error message returned as XMLWeb API 2 OData 错误消息以 XML 形式返回
【发布时间】:2014-06-04 11:47:09
【问题描述】:

我有一个通过服务代理调用的对 OData Web API 的批处理请求:

_productService.AttachTo("Products", product1);
_productService.UpdateObject(product1);
_productService.AttachTo("Products", product2);
_productService.UpdateObject(product2);
_productService.AttachTo("Products", product3);
_productService.UpdateObject(product3);

_productService.SaveChanges(SaveChangesOptions.Batch);

这会命中 ProductsController 的 patch 方法。如果请求无效,特别是返回 BadRequest 行:

public IHttpActionResult Patch([FromODataUri] int key, Delta<Product> patch)
{

    Product product = db.Products.Find(key);

    patch.Patch(product);

    HttpActionContext actionContext = new HttpActionContext(ControllerContext, Request.GetActionDescriptor());

    if (!Configuration.Services.GetBodyModelValidator().Validate(maintenance, typeof(Product), Configuration.Services.GetModelMetadataProvider(), actionContext, String.Empty))
    {
        return BadRequest(actionContext.ModelState);
    }
    else
    {

引发类型为 DataServiceRequestException 的错误消息。其 Response 属性包含 System.Data.Services.Client.ChangeOperationResponse 的集合。其中的每一个都有 Error、Headers 和 StatusCode 属性。我的问题是错误属性是一个 xml 字符串,例如。

<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <m:code />
    <m:message xml:lang="en-US">The request is invalid.</m:message>
    <m:innererror>
        <m:message>BookedForDate : 'Booked For Date' must not be empty.&#xD;\n</m:message>
        <m:type></m:type>
        <m:stacktrace></m:stacktrace>
    </m:innererror>
</m:error>

我想提取其中的某些部分以返回给客户端。

我是否必须解析 XML,或者有什么方法可以将其作为 Exception 对象返回或将其转换为对象?

感谢您的任何帮助或想法。

【问题讨论】:

    标签: c# exception-handling error-handling odata asp.net-web-api2


    【解决方案1】:

    我使用了类似的东西来返回错误的消息部分。您必须查看内部异常并在查询节点时使用命名空间,否则不会返回任何内容。

    var doc = XDocument.Parse(e.InnerException.Message);

    var msg = from node in doc.Root.Elements(doc.Root.GetDefaultNamespace() + innererror").Elements(doc.Root.GetDefaultNamespace() + "message") 选择节点.值;

    返回 msg.LastOrDefault();

    【讨论】:

    • 谢谢,帮了我很多忙!
    【解决方案2】:

    我从 scidec 稍微更新代码

      private string ExtractMessage(Exception e)
        {
            var doc = XDocument.Parse(e.InnerException.Message);
    
            var nspace = doc.Root.GetNamespaceOfPrefix("m"); // .GetDefaultNamespace();
            var msg = from node in doc.Root.Elements(nspace + "innererror")
                        .Elements(nspace + "internalexception")
                        .Elements(nspace + "message")
                      select node.Value;
    
            return msg.LastOrDefault();
        }
    

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多