Asp.net ApiController: как представить переменные параметры в модели запроса - PullRequest
1 голос
/ 10 марта 2019

Я перевожу старый сервис на Asp.net, и мне нужно сохранить устаревший формат запроса.Сложность заключается в том, что число параметров тела POST является переменным, причем число определяется параметром count.Например ...

COUNT = 3 & PARAM1 = A & PARAM2 = B & PARAM3 = C

Я использую ApiController для другого вызова, и он отлично работает.Однако в этом случае я не знаю, как определить модель, не создавая кучу свойств заполнителей (PARAM1, PARAM2, ..., PARAM100).

Так что .. если у меня есть это ..

public class MyController : ApiController
{
  public HttpResponseMessage MyService(MyServiceRequest request)
  {
  }
}

Как я могу определить класс MyServiceRequest таким образом, чтобы я мог получить доступ к PARAM1, PARAM2 и т. Д. (Без предопределения большего количества свойств PARAM, чем, я думаю, мне когда-либо понадобится)?

public class MyServiceRequest
{
    public string COUNT { get; set; }

    /* Don't want to have to do this
    public string PARAM1 { get; set; }
    public string PARAM2 { get; set; }
    :
    public string PARAM1000 { get; set; }
    */
}

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Рассмотрите возможность реализации связывателя пользовательской модели

//using System.Web.Http.ModelBinding;
public class LegacyBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        //reading request data
        NameValueCollection formData = actionContext.ControllerContext.Request.Content.ReadAsFormDataAsync().GetAwaiter().GetResult();

        var model = new MyServiceRequest
        {
            Params = new List<string>()
        };
        model.Count = formData["count"];

        foreach (string name in formData)
        {
            //simple check, "param1" "paramRandomsring" will pass
            //if (name.StartsWith("param", StringComparison.InvariantCultureIgnoreCase))
            //more complex check ensures "param{number}" template
            if (Regex.IsMatch(name, @"^param\d+$", RegexOptions.IgnoreCase))
            {
                model.Params.Add(formData[name]);
            }
        }

        bindingContext.Model = model;
        return true;
    }
}

И сообщите платформе, чтобы использовать эту привязку модели для конкретной модели

[ModelBinder(typeof(LegacyBinder))]
public class MyServiceRequest
{
    public string Count { get; set; }

    public List<string> Params { get; set; }
}

Подробнее о связывании модели в ASP.NET Web API см. В документы .

0 голосов
/ 10 марта 2019

В таких случаях я обычно использую List параметр:

public class MyServiceRequest
{
   public List<string> PARAM { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...