发送.net核心API中httpresponse内容中的json数据

发送.net核心API中httpresponse内容中的json数据,api,asp.net-web-api,.net-core,asp.net-web-api2,asp.net-core-webapi,Api,Asp.net Web Api,.net Core,Asp.net Web Api2,Asp.net Core Webapi,我正在尝试使用API在数据库中插入多个用户。现在,假设有三个用户要插入,并且假设一个用户没有被插入,但另外两个用户成功插入。所以,我有一个显示响应的要求,它显示用户第一个成功插入,用户第二个有错误。这就是我使用httpResponseMessage列表的原因,在每个httpresponsemessageobject中,我将添加完整的用户json,表明这就是用户,其状态为失败或成功 因此,根据我的实施 我使用foreach循环在db中插入多个用户并返回如下响应,但我的api响应在内容中未显示“用户

我正在尝试使用API在数据库中插入多个用户。现在,假设有三个用户要插入,并且假设一个用户没有被插入,但另外两个用户成功插入。所以,我有一个显示响应的要求,它显示用户第一个成功插入,用户第二个有错误。这就是我使用httpResponseMessage列表的原因,在每个httpresponsemessageobject中,我将添加完整的用户json,表明这就是用户,其状态为失败或成功

因此,根据我的实施

我使用foreach循环在db中插入多个用户并返回如下响应,但我的api响应在内容中未显示“用户”对象:

public async Task<List<HttpResponseMessage>> InserUsers(JArray obj)
{
List<myDTO> users = obj.ToObject<List<myDTO>>();
List<HttpResponseMessage> list = new List<HttpResponseMessage>();
 foreach (var user in users)
{
    var response = Insert(user);
     list.Add(new HttpResponseMessage
                    {

                        Content = new StringContent(JsonConvert.SerializeObject(user), System.Text.Encoding.UTF8, "application/json"),
                        ReasonPhrase = response.ReasonPhrase,
                        StatusCode = response.StatusCode
                    });

}
return returnResposeList;
}

 public HttpResponseMessage Insert(User user)
{
     // do insert and if there is error

       return new HttpResponseMessage()
                {
                    StatusCode = HttpStatusCode.Error,
                    ReasonPhrase = $"Error"
                };

     else
    {
          return new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                ReasonPhrase = $"Successfully inserted"
            };
    }
}
公共异步任务插入器(JArray obj)
{
List users=obj.ToObject();
列表=新列表();
foreach(用户中的var用户)
{
var响应=插入(用户);
列表。添加(新的HttpResponseMessage)
{
Content=newstringcontent(JsonConvert.SerializeObject(用户),System.Text.Encoding.UTF8,“应用程序/json”),
ReasonPhrase=response.ReasonPhrase,
StatusCode=response.StatusCode
});
}
返回响应列表;
}
公共HttpResponseMessage插入(用户)
{
//如果有错误,请插入
返回新的HttpResponseMessage()
{
StatusCode=HttpStatusCode.Error,
ReasonPhrase=$“错误”
};
其他的
{
返回新的HttpResponseMessage()
{
StatusCode=HttpStatusCode.OK,
ReasonPhrase=$“已成功插入”
};
}
}

感谢并问候

根据一些评论,我不明白为什么每次插入都需要状态码,而不是返回bool或类似插入Id的内容

我认为类似这样的方法适用于您已经显示的内容以及返回用户对象:

 public async Task<ObjectResult> InserUsers(JArray obj)
    {
        List<myDTO> users = obj.ToObject<List<myDTO>>();
        List<InsertUserResponseDto> list = new List<InsertUserResponseDto>();
        foreach (var user in users)
        {
            var isSuccess = Insert(user);
            list.Add(new InsertUserResponseDto
            {
                User = user,
                StatusCode = isSuccess ? StatusCodes.Status200OK : StatusCodes.Status500InternalServerError,
            });

        }

        var isSuccessfullInsert = list.Any(x => x.StatusCode == StatusCodes.Status207MultiStatus);
        return StatusCode(isSuccessfullInsert ? StatusCodes.Status207MultiStatus : StatusCodes.Status200OK, list);
    }

    public bool Insert(User user)
    {
        try
        {
            // Complete insert
            return true;
        }
        catch (Exception ex)
        {
            // Log Exception
            return false;
        }
    }

    public class InsertUserResponseDto
    {
        public User User { get; set; }
        public int StatusCode { get; set; }
    }
公共异步任务插入器(JArray obj)
{
List users=obj.ToObject();
列表=新列表();
foreach(用户中的var用户)
{
var isSuccess=插入(用户);
列表。添加(新的InsertUserResponseTo
{
用户=用户,
StatusCode=isSuccess?StatusCodes.Status200OK:StatusCodes.Status500InternalServerError,
});
}
var issuccesfullinsert=list.Any(x=>x.StatusCode==StatusCodes.Status207MultiStatus);
返回状态代码(isSuccessfullInsert?状态代码.Status207MultiStatus:StatusCodes.Status200OK,列表);
}
公共布尔插入(用户)
{
尝试
{
//完整插入
返回true;
}
捕获(例外情况除外)
{
//日志异常
返回false;
}
}
公共类InsertUserResponseTo
{
公共用户{get;set;}
公共int状态码{get;set;}
}

如果任何插入失败,我使用的响应代码为207,否则我使用的是200。列表中的每个对象都将包含原始用户对象以及您想要的相关状态代码,包括成功和失败的处理。

根据一些评论,我不明白为什么每次插入都需要状态代码,而不是返回bool或类似插入Id的内容

我认为类似这样的方法适用于您已经显示的内容以及返回用户对象:

 public async Task<ObjectResult> InserUsers(JArray obj)
    {
        List<myDTO> users = obj.ToObject<List<myDTO>>();
        List<InsertUserResponseDto> list = new List<InsertUserResponseDto>();
        foreach (var user in users)
        {
            var isSuccess = Insert(user);
            list.Add(new InsertUserResponseDto
            {
                User = user,
                StatusCode = isSuccess ? StatusCodes.Status200OK : StatusCodes.Status500InternalServerError,
            });

        }

        var isSuccessfullInsert = list.Any(x => x.StatusCode == StatusCodes.Status207MultiStatus);
        return StatusCode(isSuccessfullInsert ? StatusCodes.Status207MultiStatus : StatusCodes.Status200OK, list);
    }

    public bool Insert(User user)
    {
        try
        {
            // Complete insert
            return true;
        }
        catch (Exception ex)
        {
            // Log Exception
            return false;
        }
    }

    public class InsertUserResponseDto
    {
        public User User { get; set; }
        public int StatusCode { get; set; }
    }
公共异步任务插入器(JArray obj)
{
List users=obj.ToObject();
列表=新列表();
foreach(用户中的var用户)
{
var isSuccess=插入(用户);
列表。添加(新的InsertUserResponseTo
{
用户=用户,
StatusCode=isSuccess?StatusCodes.Status200OK:StatusCodes.Status500InternalServerError,
});
}
var issuccesfullinsert=list.Any(x=>x.StatusCode==StatusCodes.Status207MultiStatus);
返回状态代码(isSuccessfullInsert?状态代码.Status207MultiStatus:StatusCodes.Status200OK,列表);
}
公共布尔插入(用户)
{
尝试
{
//完整插入
返回true;
}
捕获(例外情况除外)
{
//日志异常
返回false;
}
}
公共类InsertUserResponseTo
{
公共用户{get;set;}
公共int状态码{get;set;}
}

如果任何插入失败,我使用的响应代码为207,否则我使用的是200。列表中的每个对象将包含原始用户对象以及您想要的相关状态代码,包括成功和失败的处理。

对于
HttpResponseMessage
,它用于描述整个响应,您应该避免使用多个
HttpResponseMessage
返回
HttpResponseMessage

对于另一个选项,您可以尝试创建自己的
HttpResponseMessage
like

public class ApiResponseMessage
{
    //
    // Summary:
    //     Gets or sets the reason phrase which typically is sent by servers together with
    //     the status code.
    //
    // Returns:
    //     The reason phrase sent by the server.
    public string ReasonPhrase { get; set; }
    //
    // Summary:
    //     Gets or sets the status code of the HTTP response.
    //
    // Returns:
    //     The status code of the HTTP response.
    public HttpStatusCode StatusCode { get; set; }
    //
    // Summary:
    //     Gets or sets the content of a HTTP response message.
    //
    // Returns:
    //     The content of the HTTP response message.
    public object Content { get; set; }

}
然后

[HttpPost("InserUsers")]
public async Task<List<ApiResponseMessage>> InserUsers()
{
    List<User> users = new List<User> {
        new User{ Name = "Jack" },
        new User{ Name = "Tom"},
        new User{ Name = "Tony"}
    };
    List<ApiResponseMessage> list = new List<ApiResponseMessage>();
    foreach (var user in users)
    {
        var response = Insert(user);
        list.Add(new ApiResponseMessage
        {

            Content = new { user },
            ReasonPhrase = response.ReasonPhrase,
            StatusCode = response.StatusCode
        });

    }
    return list;
}

public ApiResponseMessage Insert(User user)
{
    // do insert and if there is error
    if (user.Name == "Tom")
    {
        return new ApiResponseMessage()
        {
            StatusCode = HttpStatusCode.BadRequest,
            ReasonPhrase = $"Error"
        };
    }
    else
    {
        return new ApiResponseMessage()
        {
            StatusCode = HttpStatusCode.OK,
            ReasonPhrase = $"Successfully inserted"
        };
    }
}
[HttpPost(“插入器”)]
公共异步任务插入器()
{
列表用户=新列表{
新用户{Name=“Jack”},
新用户{Name=“Tom”},
新用户{Name=“Tony”}
};
列表=新列表();
foreach(用户中的var用户)
{
var响应=插入(用户);
列表。添加(新ApiResponseMessage)
{
Content=new{user},
ReasonPhrase=response.ReasonPhrase,
StatusCode=response.StatusCode
});
}
退货清单;
}
公共ApiResponseMessage插入(用户)
{
//如果有错误,请插入
如果(user.Name==“Tom”)
{
返回新的ApiResponseMessage()
{
StatusCode=HttpStatusCode.BadRequest,