【发布时间】:2021-06-27 17:44:32
【问题描述】:
如何在 web api 配置中设置自定义合同解析器?我的代码相对较新,到目前为止还没有自定义合约解析器。
除了路由,我没有添加其他自定义。
我尝试了三种不同的方法,但都没有奏效:
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//attempt 1
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver();
//attempt 2
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver();
//attempt 3
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver()
};
}
自定义合约解析器代码,调试时断点永远不会到达这里:
public class CustomContractResolver : CamelCasePropertyNamesContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
var regex = new Regex(@"([_])(\w)");
if (regex.IsMatch(propertyName))
{
var result = regex.Replace(propertyName.ToLower(), (match) => { return match.Groups[2].Value.ToUpper(); });
return result;
}
else
return base.ResolvePropertyName(propertyName);
}
}
有什么遗漏吗?
编辑 1:
我正在使用 ASP.NET WebApi 5.2.1 和 MVC 5.2.7、JSON.NET (Newtonsoft.Json) v13.0.1(并且已经尝试过旧的 v12)
我的 Global Asax 也很简单:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register); //<- web api configuration
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); //<- mvc configuration
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
MVC RouteConfig 类:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
编辑 2
这里是一些测试 web api 控制器:
using System.Web.Http;
namespace Kronos.Web.Geolocalizacao.Controllers.Api
{
public class TestController : ApiController
{
[HttpGet]
public TestModel Obtain()
{
return new TestModel { CODE_IDENTIFICATION = 1, DEFAULT_DESCRIPTION = "TEST DAT THING" };
}
}
public class TestModel
{
public decimal CODE_IDENTIFICATION { get; set; }
public string DEFAULT_DESCRIPTION { get; set; }
}
}
使用 Tabbed Postman chrome 插件进行测试
【问题讨论】:
-
您的问题是asp.net-web-api 还是asp.net-mvc-5?他们使用不同的序列化程序,并且使用的序列化程序随版本而变化,所以请edit您的问题具体说明您使用的是哪个版本和设置?
-
如果是 MVC,请注意 asp.net-mvc-5 已经很老了,第一个版本是在 2013 年发布的。它默认不使用 Json.NET。如果您想在 MVC5 中使用 Json.NET 进行序列化,请参阅Setting the default JSON serializer in ASP.NET MVC。如果你想将它用于模型绑定,请查看How to use Json.NET for JSON modelbinding in an MVC5 project?。
-
我同时使用 asp net mvc 5 和 asp net web api,.net framework 4.8
标签: asp.net json asp.net-web-api asp.net-mvc-5 json.net