簡體   English   中英

帶有枚舉輸入參數的 Webapi post 方法

[英]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的數據,請將數據作為intEnum值)而不是Enum描述傳遞。
  • 如果無法更改傳入的數據,請將參數類型更改為string並在方法體中使用Enum.Parse或;
  • 保持編寫的方法並使用自定義模型綁定器將string轉換為MessageDestinationType

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM