当前位置: 首页 > 知识库问答 >
问题:

IHttpActionResult-显式指定OK()的状态

子车征
2023-03-14

我有您的典型API路由,但是我仍然需要它返回它正在使用的Ok JSON blob,但是我需要将HttpStatusCode指定为不同的东西。

下面是API方法。

    [Route("detailedvarinfo/{VarGUID}")]
    public async Task<IHttpActionResult> GetDetailedVarInfo(string VarGUID)
    {

        if (!User.IsInRole("Admin"))
        {
            var DashboardAccess = (from DR in AuthDb.DashboardAccessVars
                                   where DR.ApplicationUser.Id == userInfo.Id
                                   select DR).
                                   AsEnumerable()
                                   .Select(x => new
                                   {
                                       VarGUID = x.VarGUID
                                   }).ToList();

            var FilteredVarInfo = VarInfo.Join(DashboardAccess, x => x.VarGUID, y => y.VarGUID, (x, y) => x);
            if (FilteredVarInfo.Any())
            {
                return Ok(FilteredVarInfo.FirstOrDefault());
            }
            else
            {
                return Ok(HttpStatusCode.Forbidden);
            }

        }
   }

我试图实现这一点,但没有任何运气。对于非OK响应,返回带有IHttpActionResult的内容

也尝试过做这样的事情..但是没有任何运气。

     public class NotAllowedOkResult<T> : OkNegotiatedContentResult<T>
{
    public NotAllowedOkResult(T content, ApiController controller, HttpStatusCode statusCode)
        : base(content, controller)
    {

    }

    public NotAllowedOkResult(T content, IContentNegotiator contentNegotiator, HttpRequestMessage request,
        IEnumerable<MediaTypeFormatter> formatters, HttpStatusCode statusCode)
        : base(content, contentNegotiator, request, formatters)
    {

    }



    public override async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = await     base.ExecuteAsync(cancellationToken);

        return response;
    }        
}

共有2个答案

公良渝
2023-03-14

您可以使用HttpResponseMessage来自定义响应。

HttpResponseMessage msg=new HttpResponseMessage(HttpStatusCode.OK);
msg.ReasonPhrase="Filterd";

return msg;
梅修贤
2023-03-14

让它工作!真的很接近,需要做更多的工作。

接口方法

[Route("detailedvarinfo/{VarGUID}")]
public async Task<IHttpActionResult> GetDetailedVarInfo(string VarGUID)
{

    if (!User.IsInRole("Admin"))
    {
        var DashboardAccess = (from DR in AuthDb.DashboardAccessVars
                               where DR.ApplicationUser.Id == userInfo.Id
                               select DR).
                               AsEnumerable()
                               .Select(x => new
                               {
                                   VarGUID = x.VarGUID
                               }).ToList();

        var FilteredVarInfo = VarInfo.Join(DashboardAccess, x => x.VarGUID, y => y.VarGUID, (x, y) => x);
        if (FilteredVarInfo.Any())
        {
            return Ok(FilteredVarInfo.FirstOrDefault());
        }
        else
        {
            return NotAllowedOk(FilteredVarInfo, StatusReason.StatusFiltered);
        }

    }
}

BaseApiController : ApiController

protected internal virtual NotAllowedOkResult<T> NotAllowedOk<T>(T content, StatusReason statusReason)
{
    return new NotAllowedOkResult<T>(content, this, statusReason);
}  

状态原因枚举

public enum StatusReason
{
    StatusFiltered
}

NotAllowedOkResult类

public class NotAllowedOkResult<T> : OkNegotiatedContentResult<T>
{
    public NotAllowedOkResult(T content, ApiController controller, StatusReason statusReason)
        : base(content, controller)
    {
        statusReasonCode = statusReason;
    }

    public NotAllowedOkResult(T content, IContentNegotiator contentNegotiator, HttpRequestMessage request,
        IEnumerable<MediaTypeFormatter> formatters, StatusReason statusReason)
        : base(content, contentNegotiator, request, formatters)
    {
        statusReasonCode = statusReason;
    }

    protected StatusReason statusReasonCode { get; set; }


    public override async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = await base.ExecuteAsync(cancellationToken);
        response.ReasonPhrase = GetStatusText(statusReasonCode);

        return response;
    }

    private static String GetStatusText(StatusReason reasonCode)
    {
        var retVal = "Unknown";
        switch (reasonCode)
        {
            case StatusReason.StatusFiltered:
                retVal = "Filtered";
                break;
        }
        return retVal;
    }
}

Javascript结果

varService.getDetailedJobInfo($stateParams.varGUID).then(function(results) {
    $scope.varDetails = results.data;
    return results;
}, function (error) {
    //alert(error.data.message);
});
//
// Actual result comes back properly!
//
results = {
   content: datablob,
   status: 200,
   statusText: "Filtered",
   config: datablob
}
 类似资料:
  • 我已经探索了很多,我发现在所有活动中,我们需要指定android:导出参数。我已经在清单中的所有活动中添加了参数,但我仍然收到此错误。 清单合并失败:android:需要为显式指定导出

  • 我已经检查了清单中的所有活动。xml文件中,所有活动都存在android:exported=“true”,但它始终显示此错误**清单合并失败:需要为元素显式指定android:exported 我的清单文件是 Gradle构建 等待早期响应

  • 当我从升级到时,我收到了这个错误。 错误 清单合并失败:android:导出需要显式指定。当相应组件定义了意图过滤器时,面向Android 12及更高版本的应用需要为指定显式值。有关详细信息,请参阅https://developer.android.com/guide/topics/manifest/activity-element#exported。

  • 当我将目标和编译SDK版本从30更改为31时,我得到一个错误。类似于这个问题,但没有答案。 错误:android:导出需要显式指定。针对Android 12及更高版本的应用程序需要指定一个显式值为时,相应的组件定义了一个意图过滤器。详见https://developer.android.com/guide/topics/manifest/activity-element#exported。 但是,

  • 像这段代码一样,C编译器将把char*转换为bool,然后调用第一个函数,这与我的初衷不一致。有没有办法阻止编译器执行我不想要的类型转换?比如“-fno permissive”,但不幸的是,它不起作用。

  • 我试图实现分页和排序的HTTP请求使用Spring的分页。一切正常,除了我想明确声明可排序的属性,即资源属性,,。默认实现允许用户调用HTTP请求和排序结果的所有属性。但是,我想限制排序仅列和。 下面是我当前代码的示例 显而易见的解决方案是从可分页对象中检索排序对象,并像这样手动验证属性 } 我的问题是,在Spring中是否存在一种仅通过显式定义的属性进行排序的更简单方法。