C# ASP.NET WebApi ApiController更改状态代码
我在.NET中有一个RESTful服务,我希望所有操作都返回JsonResult类型的对象,JsonResult是我定义的对象,如下所示: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
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);
}
}