我有这个控制器方法:
[HttpGet]
[Route("SystemCheck/PulseCheck")]
public HttpResponseMessage PulseCheck()
{
//this is a string
var pulseCheck = PulseCheckHelper.PulseCheck();
var response = Request.CreateResponse((HttpStatusCode.OK), pulseCheck);
return response;
}
回复如下: [ " 2&#34 ;, " 2&#34 ;, " 9&#34 ;, " 9" 而不是" 2299"
有什么想法吗?
我也尝试了不同的变体,如:
[HttpGet]
[Route("SystemCheck/PulseCheck")]
[ResponseType(typeof(string))]
public string PulseCheck()
{
//this is a string
var pulseCheck = PulseCheckHelper.PulseCheck();
return pulseCheck;
}
但结果相同。我是否缺少任何WebApiConfig。我有其他应用程序可以使用相同的控制器方法代码正常工作,但无法识别配置差异。
这是在我的WebApiConfig中:
public static void Register(HttpConfiguration config)
{
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.MessageHandlers.Add(new Security.WebApi.AuthenticationHandler());
config.Services.GetFilterProviders().ToList().ForEach(provider => config.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider), provider));
config.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider), new OrderedFilterProvider());
config.Filters.Add(new ExceptionHandlingAttribute());
config.Filters.Add(new InspectActionContextFilter());
config.Filters.Add(new NewRelicFilter());
config.Filters.Add(new EnableQueryAttribute
{
PageSize = DefaultPageSize,
EnsureStableOrdering = false
});
}
更新:似乎罪魁祸首是WebApiConfig中的以下代码注册:
config.Filters.Add(new EnableQueryAttribute
{
PageSize = DefaultPageSize,
EnsureStableOrdering = false
});
这是为所有Controller方法启用OData查询。如果我删除这些行,那么我得到正确的回复" 2299"。现在我的问题是,如何为我的特定控制器方法禁用OData?
答案 0 :(得分:0)
如果您可以更改回复的结构,请将操作更改为以下内容:
[HttpGet]
[Route("SystemCheck/PulseCheck")]
public object PulseCheck()
{
var pulseCheck = PulseCheckHelper.PulseCheck();
return new { pulseCheck };
}
然后返回
{ pulseCheck: "3123" }
答案 1 :(得分:0)
看起来它将字符串视为字符列表,因此您可以查询它。但是,您可以通过将操作更改为以下内容来强制它考虑单个结果:
[HttpGet]
[Route("SystemCheck/PulseCheck")]
public SingleResult<string> PulseCheck()
{
var pulseCheck = PulseCheckHelper.PulseCheck();
return SingleResult.Create(new[]{ pulseCheck }.AsQueryable());
}