我在.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,
}
所以目前我的行动看起来像那样:
public JsonResult<string> Get()
{
return JsonResult<string>.CreateResponse("Ciao Mondo!");
}
它有效,我喜欢这种形式&#39;因为当我读到公司时我已经知道我想要回到客户端(JsonResult,T是我的数据类型)......但问题是什么时候我想管理状态代码。
在创建这个新项目之前,为了管理状态代码,我使用了HttpResponseMessage和Request.CreateResponse方法将一些数据返回给客户端:
public HttpResponseMessage Get()
{
return Request.CreateResponse(HttpStatusCode.BadRequest, "Ciao Mondo!");
}
但我不喜欢这样,因为不能立即知道返回的类型。
所以...我的问题是......如何将状态代码管理到我的JsonResult.CreateResponse(T,Notify [,HttpStatusCode])方法中?
此方法被移入CustomApiController(继承自ApiController),因此我有HttpContext和Request可用。
非常感谢所有人
答案 0 :(得分:1)
您可以致电Content,该{{3}}接受Original column: ABC-DEF-PQR-XYZ
New col1 : ABC
New col2 : ABC-DEF
New col3 : ABC-DEF-PQR
New col4 : ABC-DEF-PQR-XYZ
以及通用对象。它确实要求您将方法的返回类型更改为HttpStatusCode
,这通常是首选。
IHttpActionResult
答案 1 :(得分:0)
它首选使用IHttpActionResult,不要强行定义它 JsonResult。这应该可以通过内容协商进行配置。
您可以尝试如下:
public IHttpActionResult Get()
{
if(error)
BadRequest("Bad Request !!");
return Ok("Ciao Mondo!");
}
答案 2 :(得分:0)
你的回答非常有帮助。我正在寻找另一个解决方案,但你给了我一个好主意,我找到了这个解决方案:
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);
}
}
所以我可以从CustomApiController继承并写下这样的动作:
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);
}
}
非常感谢!