Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebApi ApiController更改状态代码_C#_.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# ASP.NET WebApi ApiController更改状态代码

C# ASP.NET WebApi ApiController更改状态代码,c#,.net,asp.net-mvc,asp.net-web-api,C#,.net,Asp.net Mvc,Asp.net Web Api,我在.NET中有一个RESTful服务,我希望所有操作都返回JsonResult类型的对象,JsonResult是我定义的对象,如下所示: public class JsonResult<T> { public Notify Notify {get; set;} public T Data {get; set;} public static CreateResponse(T Data, Notify Notify = null, HttpStatusCode

我在.NET中有一个RESTful服务,我希望所有操作都返回JsonResult类型的对象,JsonResult是我定义的对象,如下所示:

public class JsonResult<T>
{
    public Notify Notify {get; set;}
    public T Data {get; set;}

    public static CreateResponse(T Data, Notify Notify = null, HttpStatusCode Code = HttpStatusCode.OK)
    {
        //Code param not manage, at the moment

        return new JsonResult<T>
        {
            Data = Data,
            Notify = Notify
        };

    }
}

public class Notify
{
    public string Message {get; set;}
    public Severity Severity {get; set;}
}

public enum Severity
{
    Error,
    Info,
    Warning,
    Fatal,
}
但我不喜欢这样,因为现在还不能马上知道返回的类型

所以。。。我的问题是。。。如何将状态代码管理到JsonResult.CreateResponse(T,Notify[,HttpStatusCode])方法中

此方法被移动到CustomApicController中(从ApicController继承),因此我有可用的HttpContext和请求

非常感谢all

,您可以调用它,它接受一个
HttpStatusCode
以及一个通用对象。它确实需要您将方法的返回类型更改为
IHttpActionResult
,这通常是首选

public IHttpActionResult Get()
{
  if(someErrorCondition)
     return Content(HttpStatusCode.BadRequest, JsonResult<string>.CreateResponse("Ciao Mondo!"));
  return Ok(JsonResult<string>.CreateResponse("Ciao Mondo!"));
}
public IHttpActionResult Get()
{
if(someErrorCondition)
返回内容(HttpStatusCode.BadRequest、JsonResult.CreateResponse(“Ciao Mondo!”);
返回Ok(JsonResult.CreateResponse(“CiaoMondo!”);
}

最好使用IHttpActionResult,不要强制将其定义为 JsonResult。这应该可以通过内容协商进行配置

您可以尝试以下操作:

     public IHttpActionResult Get()
     {
      if(error)
          BadRequest("Bad Request !!");
       return Ok("Ciao Mondo!");
     }

你的回答很有帮助。我正在寻找另一个解决方案,但你给了我一个好主意,我找到了这个解决方案:

public class CustomApiController : ApiController
{

    public class JsonResult<Target> : NegotiatedContentResult<Target>
    {
        public JsonResult(HttpStatusCode statusCode, Json<Target> content, ApiController controller) : base(statusCode, content.Data, controller)
        {

            this.Content = content;
        }

        public JsonResult(HttpStatusCode statusCode, Target content, ApiController controller) : base(statusCode, content, controller)
        {

        }

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

        }

        public new Json<Target> Content { get; private set; }

    }


    public JsonResult<Target> CreateResponse<Target>(Target Data, string Notify, HttpStatusCode Code = HttpStatusCode.OK)
    {
        Json<Target> json = new Json<Target>
        {
            Notify = Notify,
            Data = Data
        };

        return new JsonResult<Target>(Code, json, this);
    }

}
公共类CustomApicController:ApicController
{
公共类JsonResult:NegotiatedContentResult
{
公共JsonResult(HttpStatusCode状态码、Json内容、ApiController控制器):基(状态码、内容、数据、控制器)
{
这个。内容=内容;
}
公共JsonResult(HttpStatusCode状态码、目标内容、ApiController控制器):基(状态码、内容、控制器)
{
}
public JsonResult(HttpStatusCode状态码、目标内容、IContentNegotiator内容谈判者、HttpRequestMessage请求、IEnumerable格式化程序)
:base(状态码、内容、内容谈判者、请求、格式化程序)
{
}
公共新Json内容{get;private set;}
}
public JsonResult CreateResponse(目标数据,字符串通知,HttpStatusCode=HttpStatusCode.OK)
{
Json=新的Json
{
通知,
数据=数据
};
返回新的JsonResult(代码、json、this);
}
}
因此,我可以从CustomApicController继承并编写如下操作:

public JsonResult<string> Get()
{

    return JsonResult<string>.CreateResponse("Ciao Mondo!");
}
    public JsonResult<IEnumerable<string>> Get(bool test)
    {
        if (test)
        {
            return this.CreateResponse(new string[] { "test1", "test2", "test3" } as IEnumerable<string>, null, System.Net.HttpStatusCode.OK);
        }
        else
        {
            return this.CreateResponse(new string[] { "test1", "test2", "test3" } as IEnumerable<string>, null, System.Net.HttpStatusCode.BadRequest);
        }
    }
publicjsonresult-Get(bool测试)
{
如果(测试)
{
返回这个.CreateResponse(新字符串[]{“test1”、“test2”、“test3”}作为IEnumerable,null,System.Net.HttpStatusCode.OK);
}
其他的
{
返回这个.CreateResponse(新字符串[]{“test1”、“test2”、“test3”}作为IEnumerable,null,System.Net.HttpStatusCode.BadRequest);
}
}

非常感谢

如果您返回一个响应,这意味着请求找到了被请求的实体,因此唯一合理的状态代码是200。除了200 OK之外,您还想返回哪个状态码?为什么?它并不总是正确的。。。如果我不能(出于上千个原因)执行代码的一部分,我希望管理错误,而不是将其扔给客户端。例如:我发现了一个超时,我想生成一个通知来解释它,但这并不意味着我有一个好的响应,并且我的请求得到了满足。
    public JsonResult<IEnumerable<string>> Get(bool test)
    {
        if (test)
        {
            return this.CreateResponse(new string[] { "test1", "test2", "test3" } as IEnumerable<string>, null, System.Net.HttpStatusCode.OK);
        }
        else
        {
            return this.CreateResponse(new string[] { "test1", "test2", "test3" } as IEnumerable<string>, null, System.Net.HttpStatusCode.BadRequest);
        }
    }