我从ServiceStack Service中的异常中获取了500页而不是ResponseStatus

时间:2014-11-24 15:30:45

标签: servicestack

使用ServiceStack 4.0.33并给出以下简化的DTO ......

[Route("/products")]
[Route("/products/{Id}")]    
public class Product : IReturn<ProductResponse>
{
    [PrimaryKey]
    public string Id { get; set; }
    public string Description { get; set; }
}

public class ProductResponse
{
    public Product Product { get; set; }
}

使用以下简化服务...

public class ProductService : Service
{
    public object Post(Product product)
    {
        Db.Insert<Product>(product);
        return new ProductResponse() { Product = product };
    }
}

并在ProductsController

中通过此方式调用它
using (var productService = ResolveService<ProductService>())
{
    var result = productService.Post(product);
    if (result.IsErrorResponse())
        return View(product);
    else
        return RedirectToAction("Index");
}

如果我尝试发布一个有意复制主键的新产品,我会得到一个500错误的HTML样式页面而不是ResponseStatus来填充并返回...

enter image description here

我见过很多不同的StackOverflow帖子,说明ResponseStatus不会填充的不同原因,但我尝试了几件事无济于事。我错过了什么(希望很简单)?

2 个答案:

答案 0 :(得分:0)

您在哪里定义重复键的处理方式与HTTP 500不同的行为。您期望的其他响应是什么? ResponseStatus可以包含HTTP 500,它仅表示服务器端错误。

你必须明确地定义你想要以不同方式处理错误,如果是这样,你需要什么类型的错误(哪个错误代码,哪个消息)解释为here

例如:

public object Get(User request) 
{
    throw HttpError.NotFound("User {0} does not exist".Fmt(request.Name));
}

查看ServiceStack教程了解更多信息。

答案 1 :(得分:0)

您收到的错误页面是自定义ASP.NET错误页面,它劫持了您的ASP.NET Web应用程序返回的任何自定义500 HTTP错误响应。

可以通过以下方式禁用它:

<system.web>
    ...
    <customErrors mode="Off" />
</system.web>

<system.webServer>
    <httpErrors errorMode="Detailed" />
</system.webServer>

这是设置TrySkipIisCustomErrors = true的另一个alternative of disabling IIS errors,可以在ServiceStack中设置:{/ p>

GlobalRequestFilters.Add((req, res, dto) =>
{
    ((HttpResponse)res.OriginalResponse).TrySkipIisCustomErrors = true;
});