我通常有如下所示的ApiController方法
[HttpPost]
public HttpResponseMessage DoSomething(int someId)
{
var someObj = Session.Get<SomeObj>(someId);
if (someObj == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
Do something...
}我想摆脱如果条件。我只允许抛出一个NullPointerException,但我希望能够指定返回哪个HTTP代码。我希望将if条件移到某个验证类中,并在OnActionExecuting中执行验证。
我以前在WebAPI中使用过WebAPI,最好有这样的语法:
RuleFor(x => x.SomeId).Must(x => someObjectExists()).WithMessage("SomeObject wasn't found").WithHTTPStatusCode(HttpStatusCode.NotFound);..。WithHTTPStatusCode将是解决我的问题的方法。
你有什么意见建议?
发布于 2016-01-03 05:50:13
好酷的名字!
我想向你推荐这种方法。创建一个您定义的新类,名为ServiceNotFoundException或类似的类,并让它从HttpResponseException继承,传入一个404而不是构造函数,如下所示:
public class ServiceNotFoundException : HttpResponseException
{
public ServiceNotFoundException() : base(HttpStatusCode.NotFound)
{
}
}现在,在您的Session.Get中,如果在其中找不到该实体,您应该抛出异常(因此请将此逻辑保持在控制器之外)。
这样,如果多个控制器使用您的服务,则在所有情况下都会引发异常。因为您继承了HttpResponseException并抛出了NotFound,所以它将返回一个404。如果您需要使用特定的文本/消息,那么可以使用构造函数,这样就可以看到base()有一个可以交替添加的HttpResponseMessage (也许可以在响应中设置特定的消息文本)。
如果您更喜欢在控制器中执行这个逻辑,那么无论如何您都可以抛出异常,但是您应该尽量避免重复!
如果有什么问题请告诉我!
发布于 2014-04-02 19:59:34
我喜欢更安静地处理这个问题,因为它会让任何人都不知道WebAPI端点是否缺少所需的变量。
[AcceptVerbs("GET", "POST")]
public ServiceResult Login(JObject args)
{
var retVal = new ServiceResult {Success = false};
JToken tokenValue;
var email = string.Empty;
var password = string.Empty;
if (args.TryGetValue("email", out tokenValue))
{
email = args.Value<string>("email");
}
if (args.TryGetValue("password", out tokenValue))
{
password = args.Value<string>("password");
}
var user = Services.Users.GetByEmail(email, true);
if (null != user || null != user.Id)
{
return Services.Authentication.AuthenticateSignIn(user, password, true);
}
retVal.Data = tokenValue;
return retVal;
}如果缺少变量,默认情况下,除非将App_Start/WebApiConfig.cs设置为
config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;如果您不喜欢If条件,则在获取变量后始终可以使用Assert。祝好运!
发布于 2016-07-06 16:47:58
为什么不使用标准模型验证?您正在使用实体框架吗?您可以使用pocos上的数据注释来实现这一点,或者可能根据需要创建一个模型,在您的示例中,一个具有单个属性的类将做得很好。
public async Task<IHttpActionResult> PutOrder(int id, Order order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}...订单模型会像这样..。
public partial class Order
{
[Required]
public int id { get; set; }
}https://stackoverflow.com/questions/22765093
复制相似问题