gpt4 book ai didi

C# WebAPI 按 POST 值类型路由

转载 作者:行者123 更新时间:2023-11-30 23:31:41 25 4
gpt4 key购买 nike

我有一个创建 Web API 的请求,该 API 能够接受 POST 请求并根据参数中接收到的数据类型(DataAvailableNotification 与 ExpiredNotification)采取不同的操作。

我创建了一个 ApiController 并公开了两个方法:

    [HttpPost]
public void DataAvailable(DataAvailableNotification dataAvailable,
[FromUri] string book, [FromUri] string riskType)
{

}

[HttpPost]
public void DataAvailable(ExpiredNotification dataAvailable,
[FromUri] string book, [FromUri] string riskType)
{

}

public class DataAvailableNotification
{
[JsonProperty(PropertyName = "$type")]
public string RdfType { get { return "App.RRSRC.Feeds.DataAvailable"; } }

public string SnapshotRevisionId { get; set; }

public string[] URLs { get; set; }

public string ConsumerId { get; set; }

public Guid ChannelId { get; set; }
}

public class ExpiredNotification
{
[JsonProperty(PropertyName = "$type")]
public string RdfType { get { return "Service.Feeds.Expired"; } }

public string ConsumerId { get; set; }

public Guid ChannelId { get; set; }
}

但是,他们根本不会被调用。

如果我注释掉其中一个,通知会到达 Controller ,但我无法正确处理通知类型(假定两个通知将映射到相同的方法)。

有什么方法可以配置 Web API 来查看 POSTed 值的类型并调用最匹配的 Controller 方法吗?

PS:我不能有 2 个不同的 URL 来处理不同的通知。所以请不要建议这个。

最佳答案

根据类型使用一个操作和过滤器。我通过使用反射并执行如下操作解决了同样的问题。

[HttpPost]
public void DataAvailable([FromBody]IDictionary<string, string> dataAvailable,
[FromUri] string book, [FromUri] string riskType) {
if(dataAvailable != null && dataAvailable.ContainsKey("$type") {
var type = dataAvaliable["$type"];
if(type == "App.RRSRC.Feeds.DataAvailable"){
DataAvailableNotification obj = createInstanceOf<DataAvailableNotification>(dataAvailable);
DataAvailable(obj,book,riskType);
} else if (type == "Service.Feeds.Expired") {
ExpiredNotification obj = createInstanceOf<ExpiredNotification>(dataAvailable);
DataAvailable(obj,book,riskType);
}
}
}

private void DataAvailable(DataAvailableNotification dataAvailable, string book, string riskType) {

}

private void DataAvailable(ExpiredNotification dataAvailable, string book, string riskType) {

}

private T createInstanceOf<T>(IDictionary<string, string> data) where T : class, new() {
var result = new T();
var type = typeof(T);
//map properties
foreach (var kvp in data) {
var propertyName = kvp.Key;
var rawValue = kvp.Value;
var property = type.GetProperty(propertyName);
if (property != null && property.CanWrite) {
property.SetValue(result, rawValue );
}
}
return result;
}

关于C# WebAPI 按 POST 值类型路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510395/

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