[英]Webapi post method with enum input parameter
當我嘗試調用將枚舉作為輸入參數的 Web API 方法時,為什么會出現以下屏幕截圖中的錯誤? 我該如何解決?
無論我做什么,似乎messageDestinationType
始終為空...
我更願意將輸入類型保留為枚舉。 我剛開始使用 web api,無法理解當 WCF 完美地處理這種情況時,這有多么困難
[JsonConverter(typeof(StringEnumConverter))]
public enum MessageDestinationType
{
None = 0,
[EnumMember(Value = "SMS")]
SMS = 1,
[EnumMember(Value = "Email")]
Email = 2,
PushNotification = 3,
UXP = 4,
IntermediaryApp = 5,
YouthApp = 6
}
[HttpPost, Route("ReadClientMessagesC")]
public IHttpActionResult ReadClientMessagesC([FromBody]MessageDestinationType messageDestinationType)
{
var request = new ClientInboxRequest
{
Gcn = Gcn,
ClientIpAddress = ClientIpAddress,
CallingApplication = CallingApplication.Name,
CallingApplicationVersion = CallingApplication.Version,
CookieString = CookieString,
HasPbUk = HasPbUk,
HasIamIms = HasIamIms,
HasPbZa = HasPbZa,
HasSps = HasSps,
HasWiUk = HasWiUk,
HasWiZa = HasWiZa,
LinkedGcns = LinkedGcns,
RequestId = RequestId.ToString(),
SsoProfiles = SsoProfiles.Select(x => x.Name).ToList()
};
MessageDestinationType messageDestination = (MessageDestinationType)messageDestinationType;
return Ok(ClientMessageCenterHelper.ReadClientMessagesA(Gcn, messageDestination, request));
}
錯誤消息:{ "Message": "請求無效。", "MessageDetail": "參數字典包含一個 null 條目,用於參數 'messageDestinationType' 的不可為空類型 'API.Domain.ClientMessageCenter.MessageDestinationType' 的方法' System.Web.Http.IHttpActionResult ReadClientMessagesC(API.Domain.ClientMessageCenter.MessageDestinationType)' in 'ID.ClientMessageCenter.Controllers.ClientMessageCenterController'。可選參數必須是引用類型、可為空類型或聲明為可選參數。 ” }
您可以將字符串( enum
字符串名稱)發送到 Web API 控制器(即使它具有與 OP 示例中的數值類似的數值)。 ASP.NET 框架已經為這種轉換自動發生提供了條件——你只需要啟用它。
在您的Startup.cs
ConfigureServices
方法中,將您的轉換器添加到JsonSerializerOptions.Converters
屬性。
services.AddControllers()
.AddJsonOptions(opts =>
{
opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
opts.JsonSerializerOptions.IgnoreNullValues = true;
});
我還建議將IgnoreNullValues
設置為您偏好的設置,以使其非常明確。
信用:我從這篇文章中解決了我的問題(通過regisdiogo )並無恥地復制到這里:-)
為此,您應該選擇一個字符串或一個整數來代替枚舉。
如果您仍然需要使用它,然后將其解析為您的枚舉。
就我個人而言,如果我正在使用您的 RESTful API,我更喜歡整數,因為您在這里有效地公開了一個類型。 您可以通過 Get / GetAll 方法使這些類型可用,從而使您的 API 可維護。
您有幾個不同的選擇來解決這個問題:
ReadClientMessagesC
的數據,請將數據作為int
( Enum
值)而不是Enum
描述傳遞。string
並在方法體中使用Enum.Parse或;string
轉換為MessageDestinationType
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.