Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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# Web API Json响应_C#_Json_Rest_Json.net_Asp.net Web Api2 - Fatal编程技术网

C# Web API Json响应

C# Web API Json响应,c#,json,rest,json.net,asp.net-web-api2,C#,Json,Rest,Json.net,Asp.net Web Api2,我正在为我的客户开发Web API。他们建议所有响应都应该是一个公共JSON结构 { Data:"", Status:true, Message:"" } 如果错误意味着 { Error:"", Status:false, Message:"" } 哪种方法是创建公共JSON结构作为返回的最佳方法。 现在我创建了一个具有这些属性的类。并从IHttpActionResult创建了两个类Error.cs和Success.cs,从中创建响应并从控制器返回 那东西在我的控制器里 public IHt

我正在为我的客户开发Web API。他们建议所有响应都应该是一个公共JSON结构

{ Data:"", Status:true, Message:"" }
如果错误意味着

{ Error:"", Status:false, Message:"" }
哪种方法是创建公共JSON结构作为返回的最佳方法。 现在我创建了一个具有这些属性的类。并从IHttpActionResult创建了两个类Error.cs和Success.cs,从中创建响应并从控制器返回

那东西在我的控制器里

public IHttpActionResult GetNewsAndAnnouncements()
    {
        var data = newsAndAnnouncementsDataServices.NewsAndAnnouncements();
        if (data != null && data.Count() > 0)
        {
            return new Success(Request, "News and Announcements Retrieved Successfully", data);
        }
        return new Error(Request, "No News and Announcements Found");
    }
Error.cs

public class Error : IHttpActionResult
{
    private readonly string _message;
    private readonly HttpRequestMessage _request;
    private IErrorResponseModel errorResponse;

    public Error(HttpRequestMessage request, string message)
    {
        _message = message;
        _request = request;
        errorResponse = new ErrorResponseModel();
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        errorResponse.Message = _message;
        errorResponse.Status = false;
        errorResponse.Error = _message;
        var response = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content = new ObjectContent<object>(errorResponse, new JsonMediaTypeFormatter()),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}
ErrorResponseModel.cs

public class DataResponseModel : Mobility.Common.IDataResponseModel 
{
    public object Data { get; set; }
    public string Message { get; set; }
    public bool Status { get; set; }
}
public class ErrorResponseModel : Mobility.Common.IErrorResponseModel
{
    public object Error { get; set; }
    public string Message { get; set; }
    public bool Status { get; set; }
}
这是正确的方法吗。我需要建议。有没有其他方法可以做到这一点。我听说有人授权给我。但我对这些不太了解。
请帮助我。

此问题的另一个解决方案是使用自定义处理程序连接到ASP.NET管道,以构建公共响应对象。 例如:

[DataContract]
public class ApiResponse
{
  [DataMember]
  public string Version { get { return "1.2.3"; } }

  [DataMember]
  public int StatusCode { get; set; }

  [DataMember(EmitDefaultValue = false)]
  public string ErrorMessage { get; set; }

  [DataMember(EmitDefaultValue = false)]
  public object Result { get; set; }

  public ApiResponse(HttpStatusCode statusCode, object result = null, string   errorMessage = null)
  {
      StatusCode = (int)statusCode;
      Result = result;
      ErrorMessage = errorMessage;
  }
}

看看这篇文章,看看它的参考实现

对我来说似乎是一个合理的实现。为什么不返回
Ok(dataResponse)
BadRequest(errorResponse)
?@Dennis。从哪里来?来自Controller或Success.cs。在BadRequest()中,我们只能返回字符串或ModelStateDictionary。我想退一个模型。
[DataContract]
public class ApiResponse
{
  [DataMember]
  public string Version { get { return "1.2.3"; } }

  [DataMember]
  public int StatusCode { get; set; }

  [DataMember(EmitDefaultValue = false)]
  public string ErrorMessage { get; set; }

  [DataMember(EmitDefaultValue = false)]
  public object Result { get; set; }

  public ApiResponse(HttpStatusCode statusCode, object result = null, string   errorMessage = null)
  {
      StatusCode = (int)statusCode;
      Result = result;
      ErrorMessage = errorMessage;
  }
}