gpt4 book ai didi

c# - 仅更新客户端指定值的参数

转载 作者:行者123 更新时间:2023-11-30 21:54:58 25 4
gpt4 key购买 nike

我有一个 servicestack 服务,它接受如下所示的 DTO:

[Route("/appointment/{id}", Verbs = "POST")]
public class UpdateAppointment
{
public Guid Id { get; set; }

public DateTime StartTime { get; set; }

public int Duration { get; set; }

public string Description { get; set; }

public Guid? MemberId { get; set; }
}

我如何检查 MemberId 值是否由客户端设置,因为“null”是一个有效值。通常,如果 NULL 不是有效值,我可以使用 PopulateWithNonDefaultValues() 方法。

所以结果应该是,如果我没有在我的 HTTP POST 负载中指定 MemberId,我希望服务器不更新该值。

我希望这是有道理的..

最佳答案

如果您认为客户端在调用 UpdateAppointment 服务时始终提供所有值,这通常不是问题。因此,我强烈建议您将每个属性都视为客户端提供的“有效”值,并更新所有字段。

如果只想更新部分属性列表,请创建一个单独的服务。

如果我真的需要检查客户端是否提供了一个值,您可以在 Request DTO 构造函数中指定一个不同的值,例如:

public class UpdateAppointment
{
public UpdateAppointment()
{
MemberId = Guid.Empty;
}
//...
}

其中非 Guid.Empty 值表示它由客户端填充。

或者您也可以使用计算属性:

public class UpdateAppointment
{

[IgnoreDataMember]
public bool HasMemberId { get; set; }

Guid? memberId;
public Guid? MemberId
{
get { return memberId; }
set
{
memberId = value;
HasMemberId = true;
}
}
}

一个更脆弱的替代方案是使用全局请求过滤器来缓冲请求:

appHost.PreRequestFilters.Add((httpReq, httpRes) => {
httpReq.UseBufferedStream = true;
});

它将保留请求流的副本,您可以通过以下方式在您的服务中获取该副本:

var jsonBody = base.Request.GetRawBody();
var hasMemberId = jsonBody.ToLower().Contains("memberid");

尽管注意这是依赖于序列化器的,即不能与 ProtoBuf 或 MsgPack 等二进制序列化器一起工作。

关于c# - 仅更新客户端指定值的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com