gpt4 book ai didi

c# - ASP.net WebApi - 格式错误的发布数据的自定义消息

转载 作者:太空狗 更新时间:2023-10-29 23:52:11 27 4
gpt4 key购买 nike

我有一个 MVC 4 WebAPI 应用程序。我想要做的是过滤掉任何 ModelState 由于在放置/发布期间发送的格式错误的数据而发生的错误。

我有一个 ActionFilterAttribute 检查 ModelState 是否有效。我想将状态的 ErrorMessage 发送回给用户。这部分工作正常。

/// <summary>
/// This filter will validate the models that are used in the webapi
/// </summary>
public class MyValidationFilter :System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
//ErrorResponse is just a simple data structure used to hold response
ErrorResponse errorResponse = new ErrorResponse();

//loop through each key(field) and see if it has any errors
foreach (var key in actionContext.ModelState.Keys)
{
var state = actionContext.ModelState[key];
if (state.Errors.Any())
{
string validationMessage = state.Errors.First().ErrorMessage;
errorResponse.ErrorMessages.Add(new ErrorMessage(validationMessage));
}
}

//this is a custom exception class that i have that sends the response to the user.
throw new WebAPIException(HttpStatusCode.BadRequest, errorResponse );

}

}
}

正常验证(Required、StringLength、Regex)都工作正常,因为我可以控制这些消息。

[Required(ErrorMessage = "ID is required")]
public string ID { get; set; }

但是,如果有人传递格式不正确的 XML 或 JSON 数据,我将无法控制消息。如果发生这种情况,那么我可能会得到

Unterminated string. Expected delimiter: \". Path '', line 1, position 9.

Invalid character after parsing property name. Expected ':' but got: }. Path '', line 1, position 9.

或这些显示我的命名空间的。

Error converting value \"Medium\" to type 'MyNameSpace.Tenant.WebAPIs.Library.IndividualRegistrationInfo'. Path '', line 1, position 8.

Error in line 1 position 7. Expecting element 'IndividualRegistrationInfo' from namespace 'http://schemas.datacontract.org/2004/07/MyNameSpace.Tenant.WebAPIs.Library.IndividualRegistrationInfo'.. Encountered 'Element' with name 'asdf', namespace ''

发生这种情况时,我想以某种方式发回通用的“无效数据”消息。有没有我可以使用的另一个过滤器,或者其他可以捕获并覆盖这些消息的地方?

更新

根据 Chris 的建议,我最终做了以下事情:

我为 JSON 和 XML 创建了 2 个新的格式化程序。

public class JsonFormatter : JsonMediaTypeFormatter
{
public override System.Threading.Tasks.Task<object> ReadFromStreamAsync(Type type, System.IO.Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
{

System.Threading.Tasks.Task<object> task = base.ReadFromStreamAsync(type, stream, contentHeaders, formatterLogger);

//parse error if null
if (task.Result == null)
{
//handle error here.
}

return task;
}
}


public class XMLFormatter : XmlMediaTypeFormatter
{
public override System.Threading.Tasks.Task<object> ReadFromStreamAsync(Type type, System.IO.Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
{

System.Threading.Tasks.Task<object> task = base.ReadFromStreamAsync(type, stream, contentHeaders, formatterLogger);

//parse error if null
if (task.Result == null)
{
//handle error here
}

return task;
}
}

并在 global.asax 的 Application_Start 方法中

GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonFormatter());
GlobalConfiguration.Configuration.Formatters.Insert(1, new XMLFormatter());

我不确定是否有更好的方法,但这似乎可行。

最佳答案

我不完全确定,但您可以只重载默认的 JsonMediaTypeFormatterXmlMediaTypeFormatter 实现,并用您自己的异常包装它们的异常。这样做的好处是可以直接将异常处理与问题的来源(即格式化程序)联系起来,而不是尝试通过 IExceptionFilter 来处理它。

关于c# - ASP.net WebApi - 格式错误的发布数据的自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11989145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com