Web Api 2字符串响应以字符数组

时间:2017-08-14 14:48:32

标签: c# asp.net-web-api2 odata

我有这个控制器方法:

[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?

2 个答案:

答案 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());
}